一句T-SQL语句引发的思考
2008-04-27 16:36
260 查看
**********************************************************
Author:黄山光明顶
mail:leimin@jxfw.com
version:1.0.0
date:2004-1-30
(如需转载,请注明出处!,如果有问题请发MAIL给我:-))
***********************************************************有一网友问:关于MSSQLSERVER索引优化问题:
有表Stress_test(id int,keychar(2))
id上有普通索引;
key上有簇索引;
id有有限量的重复;
key有无限量的重复;
现在我需要按逻辑与查询表中key='Az'ANDkey='Bw'ANDkey='Cv'的id
求教高手最有效的查询语句
测试环境:
Hardware:P42.6+512M+80G
Software:windowsserver2003(EnterpriseEdition)+SQLserver2000+sp3a
首先我们建立一个测试的数据,为使数据尽量的分布和随即,我们通过RAND()来随机产生2个随机数再组合成一个字符串,首先插入的数据是1,000,000条记录,然后在循环插入到58,000,000条记录。
因为是随机产生的数据,所以如果你自己测试的数据集和我测试的会不一样,但对索引的优化和运行的效率是一样的。
下面的“--//测试脚本”是产生测试数据的脚本,你可以根据需要修改@maxgroup,@maxLoop的值,比如测试1百万的记录可以:
Select@maxgroup=1000
Select@maxLoop=1000
如果要测试5千万:
Select@maxgroup=5000
Select@maxLoop=10000
所以如果你的SERVER或PC比较慢,请耐心等待.....,
(在我的PC上运行的速度是插入1百万条的时间是1.14m,插入5千八百万条的时间是19.41m,重新建立INDEX的时间是34.36m)
作为一般的开发人员很容易就想到的语句:
--语句1
selecta.[id]from
(selectdistinct[id]fromstress_testwhere[key]='Az')a,
(selectdistinct[id]fromstress_testwhere[key]='Bw')b,
(selectdistinct[id]fromstress_testwhere[key]='Cv')c
wherea.id=b.idanda.id=c.id
--语句2
select[id]
fromstress_test
where[key]='Az'or[key]='Bw'or[key]='Cv'
groupbyidhaving(count(distinct[key])=3)
--语句5
SELECTdistincta.[id]FROMstress_testASa,stress_testASb,stress_testASc
WHEREa.[key]='Az'ANDb.[key]='Bw'ANDc.[key]='Cv'
ANDa.[id]=b.[id]ANDa.[id]=c.[id]
但作为T-SQL的所谓“高手”可能会认为这种写法很“土”,也显得没有水平,所以会选择一些子查询和外连接的写法,按常理子查询的效率是比较高的:
--语句3
selectdistinct[id]fromstress_testAwhere
notexists(
select1from
(select'Az'askunionallselect'Bw'unionallselect'Cv')B
leftjoinstress_testCon C.id=A.idandB.[k]=C.[key]
whereC.idisnull)
--语句41
Author:黄山光明顶
mail:leimin@jxfw.com
version:1.0.0
date:2004-1-30
(如需转载,请注明出处!,如果有问题请发MAIL给我:-))
***********************************************************有一网友问:关于MSSQLSERVER索引优化问题:
有表Stress_test(id int,keychar(2))
id上有普通索引;
key上有簇索引;
id有有限量的重复;
key有无限量的重复;
现在我需要按逻辑与查询表中key='Az'ANDkey='Bw'ANDkey='Cv'的id
求教高手最有效的查询语句
测试环境:
Hardware:P42.6+512M+80G
Software:windowsserver2003(EnterpriseEdition)+SQLserver2000+sp3a
首先我们建立一个测试的数据,为使数据尽量的分布和随即,我们通过RAND()来随机产生2个随机数再组合成一个字符串,首先插入的数据是1,000,000条记录,然后在循环插入到58,000,000条记录。
因为是随机产生的数据,所以如果你自己测试的数据集和我测试的会不一样,但对索引的优化和运行的效率是一样的。
下面的“--//测试脚本”是产生测试数据的脚本,你可以根据需要修改@maxgroup,@maxLoop的值,比如测试1百万的记录可以:
Select@maxgroup=1000
Select@maxLoop=1000
如果要测试5千万:
Select@maxgroup=5000
Select@maxLoop=10000
所以如果你的SERVER或PC比较慢,请耐心等待.....,
(在我的PC上运行的速度是插入1百万条的时间是1.14m,插入5千八百万条的时间是19.41m,重新建立INDEX的时间是34.36m)
作为一般的开发人员很容易就想到的语句:
--语句1
selecta.[id]from
(selectdistinct[id]fromstress_testwhere[key]='Az')a,
(selectdistinct[id]fromstress_testwhere[key]='Bw')b,
(selectdistinct[id]fromstress_testwhere[key]='Cv')c
wherea.id=b.idanda.id=c.id
--语句2
select[id]
fromstress_test
where[key]='Az'or[key]='Bw'or[key]='Cv'
groupbyidhaving(count(distinct[key])=3)
--语句5
SELECTdistincta.[id]FROMstress_testASa,stress_testASb,stress_testASc
WHEREa.[key]='Az'ANDb.[key]='Bw'ANDc.[key]='Cv'
ANDa.[id]=b.[id]ANDa.[id]=c.[id]
但作为T-SQL的所谓“高手”可能会认为这种写法很“土”,也显得没有水平,所以会选择一些子查询和外连接的写法,按常理子查询的效率是比较高的:
--语句3
selectdistinct[id]fromstress_testAwhere
notexists(
select1from
(select'Az'askunionallselect'Bw'unionallselect'Cv')B
leftjoinstress_testCon C.id=A.idandB.[k]=C.[key]
whereC.idisnull)
--语句41
相关文章推荐
- 一句T-SQL语句引发的思考
- 一句T-SQL语句引发的思考
- 一句T-SQL语句引发的思考
- 一句T-SQL语句引发的思考
- 一句T-SQL语句引发的思考
- 优化一句T-SQL语句引发的思考
- 一个批量更新的sql语句引发的关于创业者心态的思考
- SQL语句引发的思考
- SQL用DataDiff查询的怪现象而引发的思考。。
- 一道面试题引发的数据库SQL语句实践(含行列转换)
- 如何在SQL Server中从触发器中获取引发该触发器的SQL语句内的相应参数?
- 在模糊查询中过滤容易引发SQL语句执行异常的符号
- Linq To SQL分页失败后引发的思考 推荐
- Linq To SQL分页失败后引发的思考
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 类型引发的sql语句一直不能执行
- sql语句group by以及count()的一些思考
- 一条sql语句引发mysql不停创建临时表的问题解决..coping to tmp table on desk
- 由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句