一条SQL,执行要10分钟才能出数据,表ST_RIVER_R的数据有大概5万条,其他都不超过1千,求大神看看你为什么这么慢,然后该怎么改?急·····小弟先谢过
select
STBPRP.stnm,
STBPRP.name,r.Z,r.TM,
'currentvalue' = (case when r.Z > b.fooldLevel then r.Z - b.fooldLevel else b.fooldLevel-r.Z end)
,'flag'=(case when r.Z > b.fooldLevel then 1 else 0 end)
from Rain_alarm b,
(select tem.STCD,tem.TM,tem.Z from ST_RIVER_R tem where TM=(select top 1 TM from ST_RIVER_R where STCD=tem.STCD order BY TM desc)) r,
(select t.stnm,name,t.stcd from TownshipInfo ,
(select stnm,townshipInfoId,stcd from ST_STBPRP_B where sttp in('PQ','ZZ','PZ')) t
where t.townshipInfoId=id) STBPRP where STBPRP.stcd=r.STCD and STBPRP.stcd=b.STCD
[最优解释]
表ST_RIVER_R 上 TM列创建索引 试试。
[其他解释]
看执行计划,是哪一步的百分比最高。
[其他解释]
其实这些性能问题,还是要看执行计划,光看语句很难判断,看看是否存在表扫描、丢失索引、丢失统计信息等等。
[其他解释]
/*你的代码应该就是下面这个意思。运行在2005及以上环境。你的SQL 思维太乱了。SQL 不是需要每张表都把需要的字段弄成子查询查出来再关联的。*/
SELECT
B.stnm
,A.name
,D.Z
,D.TM
,'currentvalue' = (case when D.Z > C.fooldLevel then D.Z - C.fooldLevel else C.fooldLevel-D.Z end)
,'flag'=(case when D.Z > C.fooldLevel then 1 else 0 end)
FROM TownshipInfo A
JOIN ST_STBPRP_B B ON A.id = B.townshipInfoId
JOIN Rain_alarm C ON B.stcd = C.stcd
CROSS APPLY (SELECT TOP 1 * FROM ST_RIVER_R WHERE STCD = B.stcd ORDER BY TM DESC) D
WHERE B.sttp in('PQ','ZZ','PZ')
CREATE NONCLUSTERED INDEX Nonclustered_TownshipInfo ON TownshipInfo (STCD)
CREATE NONCLUSTERED INDEX Nonclustered_Rain_alarm ON Rain_alarm (STCD)
[其他解释]
CSdn处处有高人啊
[其他解释]
想过用临时表吗?也许比你最初的写法快些。
[其他解释]
看代码有这么多子查询,或许可以用临时表或者表变量来保存重复使用的数据
[其他解释]