读书人

一条SQL执行要10分钟才能出数据表

发布时间: 2012-12-15 15:16:03 作者: rapoo

一条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')

[其他解释]
引用:
表ST_RIVER_R 上 TM列创建索引 试试。

怎么建?
[其他解释]
        CREATE NONCLUSTERED INDEX Nonclustered_TownshipInfo ON TownshipInfo (STCD)
CREATE NONCLUSTERED INDEX Nonclustered_Rain_alarm ON Rain_alarm (STCD)

[其他解释]
引用:
看执行计划,是哪一步的百分比最高。

额只是偶尔用下简单的查询,不是很懂数据库,不懂存储过程,求大神细讲
[其他解释]
引用:
引用:

表ST_RIVER_R 上 TM列创建索引 试试。

怎么建?

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同时帮忙看看这个问题


[其他解释]
CSdn处处有高人啊
[其他解释]
想过用临时表吗?也许比你最初的写法快些。
[其他解释]
看代码有这么多子查询,或许可以用临时表或者表变量来保存重复使用的数据
[其他解释]

引用:
SQL code?1234567891011121314/*你的代码应该就是下面这个意思。运行在2005及以上环境。你的SQL 思维太乱了。SQL 不是需要每张表都把需要的字段弄成子查询查出来再关联的。*/SELECT B.stnm ,A.name ,D.Z ,D.TM ,'currentvalue' = (case when D.Z > ……

多谢各位 已经解决 因为之前对sql 只是会简单的增撒查改 然后 项目又要得急 只能用子查询拼出来了

读书人网 >SQL Server

热点推荐