读书人

存储过程优化,排序花费大

发布时间: 2013-09-06 10:17:17 作者: rapoo

存储过程优化,排序开销大

with result0 as ( select bId,bcId,ja,jb,jc from jtable  )  

select * from (

select ROW_NUMBER() OVER (order by b.bId,r.bbId) rownum,b.bId ,b.bname ,b.sN , r.bcid, r.ja, r.jb, r.jc,
from BSI b
left join Area area on b.areaId=area.areaId
right join result0 as r on r.bId=b.bId

) pagination where pagination.rownum between 1 and 10


看到分析,排序开销大在50%以上,
这样排序的原因是,有b.bId按bId排,但有可能bId相同,这时就需要按r.bbId来排

请问怎么优化
[解决办法]
SELECT  *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY b.bId, r.bbId ) rownum ,
b.bId ,
b.bname ,
b.sN ,
r.bcid ,
r.ja ,
r.jb ,
r.jc
FROM jtable AS r
LEFT JOIN BSI b ON r.bId = b.bId--#2.如果这儿能用 INNER JOIN 的话,应该会更快些
LEFT JOIN Area area ON b.areaId = area.areaId


) pagination
WHERE pagination.rownum BETWEEN 1 AND 10

--#1.添加3个索引,如果有,就不加了。
--索引1
CREATE INDEX IX_BSI_bId ON dbo.BSI
(
bId
) INCLUDE(bname, sN)

--索引2
CREATE INDEX IX_jtable_bId_bbId ON dbo.jtable
(
bId,
bbId
) INCLUDE(bcid, ja, jb, jc)

--索引3
CREATE INDEX IX_Area_fieldlist ON dbo.Area
(
areaId
)


[解决办法]
原语句可以简化成以下..

select top 10
b.bId, b.bname, b.sN, r.bcid, r.ja, r.jb, r.jc
from BSI b
left join Area area on b.areaId=area.areaId
right join jtable as r on r.bId=b.bId
order by b.bId,r.bbId

[解决办法]
你只查询10和记录,top 10就可以了

SELECT  top 10  b.bId ,b.bname ,b.sN ,r.bcid ,r.ja ,r.jb ,r.jc
FROM jtable AS r
LEFT JOIN BSI b ON r.bId = b.bId
LEFT JOIN Area area ON b.areaId = area.areaId
order by b.bId, r.bbId

[解决办法]
引用:
看来只能通过索引了,
共2000多条,查10条用了近4秒,虽然join的表有二三十个,但还是太慢了

2000多条,排序消耗50%,楼主看的是实际的执行计划吗?建议:
#1.从逻辑上进行优化,表JOIN的较多
#2.从索引上进行优化
[解决办法]
楼主没有必要用CTE了,
改成:

SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY b.bId, r.bbId ) rownum ,
b.bId ,
b.bname ,
b.sN ,
r.bcid ,
r.ja ,


r.jb ,
r.jc
FROM jtable AS r
LEFT JOIN BSI b ON r.bId = b.bId
LEFT JOIN Area area ON b.areaId = area.areaId
) pagination
WHERE pagination.rownum BETWEEN 1 AND 10



或者:

select top 10
b.bId, b.bname, b.sN, r.bcid, r.ja, r.jb, r.jc
from BSI b
left join Area area on b.areaId=area.areaId
right join jtable as r on r.bId=b.bId
order by b.bId,r.bbId

[解决办法]
直接贴执行计划出来吧....表结构也不清楚,无法优化,除非改语句。

读书人网 >SQL Server

热点推荐