数据库性能优化---如何避免磁盘排序

77 篇文章 0 订阅
52 篇文章 1 订阅

SQL语句在order by,group by 或其他操作的时候会产生临时表或临时结果集。

这些临时结果集默认会优先在内存里面排序或存放(就是所谓的内存排序),如果排序内存不够用了,则会放入临时表空间,其实这个时候发生的就是磁盘排序。

Dbaccess sysmaster
select
trim(n.dbsname) tab_type, trim(n.owner) users,trim(n.tabname) tab_name,
dbinfo('UTC_TO_DATETIME',i.ti_created) index_createtime,
trim(dbinfo('DBSPACE', i.ti_partnum)) dbspace,
format_units(i.ti_nptotal,i.ti_pagesize) total_size,i.ti_nrows
FROM sysmaster:systabnames n, sysmaster:systabinfo i
WHERE (sysmaster:bitval(i.ti_flags, 32) = 1  OR sysmaster:bitval(i.ti_flags, 64) = 1
OR sysmaster:bitval(i.ti_flags, 128) = 1)        AND i.ti_partnum = n.partnum
order by 1,3

 

        参数DS_NONPDQ_QUERY_MEM用来设置排序内存的大小,因为DS_NONPDQ_QUERY_MEM最大只能是DS_TOTAL_MEMORY的1/4,所以要设置比较大的DS_NONPDQ_QUERY_MEM,就首先要设置较大的DS_TOTAL_MEMROY,以避免发生所谓的磁盘排序。

 

通如下SQL可以查询是否临时表都在tmpdbs上,如果发现有临时表不是在tmpdbs上的就需要排查并解决了。

select t.dbsname, t.tabname,
hex(p.partnum) partition, hex(p.flags) pflags
from sysmaster:systabnames t, sysmaster:sysptnhdr p
where t.partnum = p.partnum
and bitval(p.flags,32) = 1 -- Looking for temp tables
and trunc(p.partnum / 1048576) -- Filter: Only temps not in
in (select dbsnum -- temp dbspace
from sysdbspaces where is_temp = 0)
order by dbsname, tabname, partition

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我曾阿牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值