再发两个SQL语句效率,附执行时间图
select id,title from info where cityid=11 order by id desc
select id,title from info where substring(city,1,2)='11' order by id desc
其中cityID为INT数据类型 city为varchar数据类型
已经发过一个帖子,大家都认为第一个快,我也这么认为,可是我把city和CITYID都建索引后大家自己看结果吧
结果是差不多,甚至第二个稍快
我想问的是为什么会这样?请懂得索引的高手支招?
------解决方案-------------------- 大哥,虽然不懂 顶一下
------解决方案--------------------用的测试工具?很想用下
------解决方案--------------------为什么9和8的差别那么大?你的测试环境是独立的吗?最好不要有其他资源占用,还有你的测试平台是什么?1一定比2块,2和没有索引是一样的,另外,你的数据量多少?
------解决方案--------------------你能给我点实验数据和表结构吗。
欢迎加入MSN群:group197007@msnzone.cn
------解决方案--------------------LZ用什么测试的??
------解决方案--------------------substring(city,1,2)='11' 不是导致行计算吗?根本用不上索引呀,
LZ 给个 city 非索引的 test 再看看
------解决方案--------------------呵呵,楼主先插入几十万条数据在测试吧?
用sql server profiler测就可以。
------解决方案--------------------
------解决方案--------------------这个跟你的SQL 的原理有关
SQL会将一些需要编译,优化的语句进行缓存,而简单的SQL语句则不做处理
第一个SQL语句直接使用的是CityID ,这样的简单语句在SQL中属于直接就可以执行的,无需缓存,因此SQL会直接扫描索引来直接加载行。
而第二个语句中带有Substring语句,这样的语句很明显是需要占用cpu来计算的,因此在对此语句进行预编译以后,SQL会将该语句加载至缓存,以便下次使用的时候直接从内存读取,不用再次编译,所以性能会有所提高。
换句话说,第二种情况之所以会快是因为缓存的原因,如果不怕麻烦你可以每次从新启动SQL服务,或者执行SQL语句之间的间隔时间长一些,就会发现不一样的结果
而且你上面的测试只是显示出了从客户端到服务端的一些时间信息,如果你在服务器上用Profiler工具检测CPU ,IO读取等等信息的话,应该更为准确
以上根据SQL的原理来解释,实际结果以Profiler工具为准,记得保证没有缓存因素在内。
------解决方案--------------------lz有没有把查询缓存关掉呢?
不关掉查询缓存,测试的结果都是可笑的。
------解决方案--------------------sql2005没有用过 不知道效果如何!
------解决方案--------------------测试不懂,学习
------解决方案--------------------mark
------解决方案--------------------收藏先
------解决方案--------------------先关注一下
------解决方案--------------------几乎确定?从语句上看,如果索引键的ok
第一个百分百的快,第二个有没有索引都没用
------解决方案--------------------改天看
------解决方案--------------------MARK
------解决方案--------------------同意樓上的說法﹐一個 field 盡管有建立index,但該field在where 中套用了函數﹐index就無效
------解决方案--------------------是不是测试的有问题,数据量大的时候,第二个明显就慢!
------解决方案--------------------没搞过测试,不过数据量小的时候,测试结果很难说准!
------解决方案--------------------Mark!
------解决方案--------------------踩踩
------解决方案--------------------不懂。。 关注下。。
------解决方案--------------------