免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5727 | 回复: 10
打印 上一主题 下一主题

sybase查询优化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-04 14:32 |只看该作者 |倒序浏览
ASE12.0.0.8/P/EBF 12452 ESD4/NT (IX86)
1G的Default data cache
100M的tempdb cache ,绑定了tempdb.
tempdb的大小是1000M data , 500M log

我有一个查询时6表关联,表之间都是通过主键关联的,每个表的数据在6-10万之间,所有的查询用到的表都已经绑定到了Default data cache
。没有附件其它条件的时候一切正常,查询的结果集大约是6万条记录;附加一个条件,条件的右边是一个常量,通过sp_showplan可以看出条件用上索引了;现在的问题调整常量,当结果集在2万以下速度非常快,大约15秒,当调整常量值导致结果集在2万以上的查询,速度非常慢,需要10分钟,大家可以分析下吗?

论坛徽章:
0
2 [报告]
发表于 2008-02-04 14:45 |只看该作者

回复 #1 kanfu 的帖子

如果解释在某种情况下用上索引比全表扫描更慢?
我用dbcc   traceon(3604,302),看优化数据库的过程,发现其优化过程是一样的。所以很难理解为什么性能上会有这么大的差异?

论坛徽章:
0
3 [报告]
发表于 2008-02-04 16:05 |只看该作者

回复 #1 kanfu 的帖子

继续研究,问题好像有点意思:
说明:表Item1和Item2的主键列都是code1,code2和code3,在Item1表的code2,code3上建立了一个索引,下面是3个SQL
SQL1:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3
select convert(varchar(20),getdate(),109)
go
SQL2:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 < '201'
select convert(varchar(20),getdate(),109)
go
SQL3:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 >= '201'
select convert(varchar(20),getdate(),109)
go

第1个SQL的执行结果为:
Feb  4 2008  4:05:52
       71141
Feb  4 2008  4:05:54
第2个SQL的执行结果为:
Feb  4 2008  4:05:54
       17707
Feb  4 2008  4:06:22
第3个SQL的执行结果为:
Feb  4 2008  4:06:22
       53434
Feb  4 2008  4:06:23

以上数据测试多次,包括调整SQL的执行次序等,结果和上面的基本一致。
结果分析,第2个SQL行数最少,结果执行的速度是最慢的,如何解释?

论坛徽章:
0
4 [报告]
发表于 2008-02-04 16:27 |只看该作者

回复 #3 kanfu 的帖子

继续更新条件测试:
SQL4:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 < '301'
select convert(varchar(20),getdate(),109)
go
SQL5:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 >= '301'
select convert(varchar(20),getdate(),109)
go
SQL6:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 > '102'
select convert(varchar(20),getdate(),109)
go
SQL7:
select convert(varchar(20),getdate(),109)
SELECT count(*) FROM Item1 i1, Item2 i2
WHERE        i1.code1 = i2.code1 and i1.code2 = i2.code2 and i1.code3 = i2.code3 and i1.code2 <= '102'
select convert(varchar(20),getdate(),109)
go
结果集:
第4个SQL的执行结果为:
Feb  4 2008  4:19:54
       65309
Feb  4 2008  4:23:20
第5个SQL的执行结果为:
Feb  4 2008  4:23:20
        5832
Feb  4 2008  4:23:20
第6个SQL的执行结果为:
Feb  4 2008  4:30:26
       59387
Feb  4 2008  4:30:27
第7个SQL的执行结果为:
Feb  4 2008  4:32:11
      11754
Feb  4 2008  4:32:17
结果分析,用大于的查询速度明显要用小于的查询速度快,Sybase的优化出了什么问题?

论坛徽章:
0
5 [报告]
发表于 2008-02-04 16:37 |只看该作者
看where条件是否用到了索引,如果是聚簇索引,其查询速度在大量数据的情况下,优势非常明显
至于cache size的大小,我认为还是越大越好。因为以前经常遇到precedure无法完全执行的情况。

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2008-02-04 19:40 |只看该作者
show plan ,dbcc traceon(302) 看一下呢?
还有一个办法用optdiag statistics 看一下i1表的索引的统计分布,是否<'301'和>'201'的分别并不一样

[ 本帖最后由 chuxu 于 2008-2-4 19:43 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-02-05 00:59 |只看该作者

回复 #6 chuxu 的帖子

Item1,code2各值得记录数量
101             4441
102             7313
103             2935
104             3018
201             7409
202             6177
203             6834
204            11136
205             6733
206             8277
207             1036
301              774
302              723
303              117
304              507
305               10
401              548
402              555
501              631
502              337
601             1070
701              479
702               81

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
8 [报告]
发表于 2008-02-05 08:36 |只看该作者
这个表上次执行updata statistics 或者reorg是什么时候?
索引的统计分布和数据并不是同步更新的,所以数据的分布并不能完全等同索引的分布,而查询策略是根据索引的统计分布来处理的。

论坛徽章:
0
9 [报告]
发表于 2008-02-15 15:29 |只看该作者
create index on (code2)

论坛徽章:
0
10 [报告]
发表于 2008-02-15 16:07 |只看该作者

回复 #9 camham 的帖子

已经试过,不行的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP