一条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)
create index IX_TM on ST_RIVER_R(TM) ------其他解决方案-------------------- http://topic.csdn.net/u/20121031/18/f7328c3c-2f05-4f11-a6cc-3c3143f900ff.html同时帮忙看看这个问题 ------其他解决方案-------------------- http://topic.csdn.net/u/20121031/18/f7328c3c-2f05-4f11-a6cc-3c3143f900ff.html同时帮忙看看这个问题