首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-09-06 
存储过程优化,排序开销大with result0 as ( select bId,bcId,ja,jb,jc from jtable)select * from ( selec

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

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

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

热点排行