日期:2014-05-18  浏览次数:20590 次

【100分】真正的疑难问题,相同的语句,效率天差地别!!!!!!!!!!!
如题,下面的是相关说明:
SQL code

--视图V_test:
select a.1,a.2,a.3,b.1,b.2,b.3 from a inner join b on a.0=b.0

--语句1:
Select top 15 * FROM 
(
select ROW_NUMBER() Over(order by id) as rowId, * from V_test
where  type=123 and zt='测试'
) as tempTable where rowId > 0

--语句2:
Select top 15 * FROM 
(
select ROW_NUMBER() Over(order by id) as rowId, * from V_test
where  type=123 and zt='测试'
) as tempTable where rowId > 15
--说明,所有相关子段都加了索引,视图数据总量277万。
--语句1瞬间就出来了,语句2接近一分钟才出结果
--查看数据库记录,语句2逻辑读非常高
--为什么?两个语句完全一样,除了最后那个分页起始条件不同!
--求教各路高手不吝赐教啊[img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/54.gif][/img]



------解决方案--------------------
rowId > 15的记录是不是很多?如果很多的话可能会导致索引失效。
------解决方案--------------------
探讨
如题,下面的是相关说明:
SQL code

--视图V_test:
select a.1,a.2,a.3,b.1,b.2,b.3 from a inner join b on a.0=b.0

--语句1:
Select top 15 * FROM
(
select ROW_NUMBER() Over(order by id) as rowId, * from V_test
where ……

------解决方案--------------------
顶楼上 很可能是这样的
------解决方案--------------------
楼主最好把你的执行计划图贴出来,看看哪个部分有问题,可以优化
------解决方案--------------------
还得考虑缓存。你贴出来看看嘛
------解决方案--------------------
第一个优化器根本就不考虑where rowId > 0,因为rowId永远大于0,第二个就不同了
------解决方案--------------------
探讨

第一个优化器根本就不考虑where rowId > 0,因为rowId永远大于0,第二个就不同了