我需要一些帮助解决让我发疯的问题!
我已将ASP + SQL Server应用程序从旧服务器移动到新服务器。
旧的是带有MSDE的Windows 2000服务器,新的是带有SQL Server 2008 Express的Windows 2008。
一切都很好,甚至更快,除了一个该死的函数,其asp页面给出了一个时间。
我在管理查询窗口中尝试了该页面中的查询,它永远不会结束,而在旧服务器中,它需要大约1分钟才能完成。
查询是这样的:
SELECT DISTINCT
TBL1.TBL1_ID,
REPLACE(TBL1_TITOLO, CHAR(13) + CHAR(10), ’ ’),
COALESCE(TBL1_DURATA, 0), TBL1_NUMERO,
FLAG_AUDIO
FROM
SPOT AS TBL1
INNER JOIN
CROSS_SPOT AS CRS ON CRS.TBL1_ID = TBL1.TBL1_ID
INNER JOIN
DESTINATARI_SPOT AS DSP ON DSP.TBL1_ID = TBL1.TBL1_ID
WHERE
DSP.PTD_ID_PUNTO = 1044
AND DSP.DSP_FLAG_OK = 1
AND TBL1.FLAG_AUDIO_TESTO = 1
AND TBL1.FLAG_AUDIO_GRAFICO = ’A’
AND CRS.CRS_STATO > 2
OR TBL1.TBL1_ID IN (SELECT ID
FROM V_VIEW1
WHERE ID IS NOT NULL AND V_VIEW1.ID_MODULO = 403721)
OR TBL1.TBL1_ID IN (SELECT TBL1_ID
FROM V_VIEW2
WHERE V_VIEW2.ID_PUNTO = 1044)
ORDER BY
TBL1_NUMERO
我尝试将最后一行中的2个视图转换为表格,并且查询有效,即使比以前慢一点。
我已经使用它的备份/恢复功能迁移了数据库。可能是和索引问题? 有什么建议吗?
提前致谢!
的Alessandro
答案 0 :(得分:2)
执行命令
--Defrag all indexes
sp_msForEachTable 'DBCC DBREINDEX (''?'')'
--Update all statistics
sp_msForEachTable 'UPDATE STATISTICS ? WITH FULLSCAN'
如果这不是“只是修复它”,那么SQL Server优化器中的一些微妙的“改进”会使事情变得更糟。
尝试使用索引调整向导(或其等效的SSMS2008)。
之后,您将不得不开始挑选查询,删除内容直到它快速运行。由于您有2个OR
子句,因此您基本上有3个单独的查询:
SELECT ... FROM ...
WHERE DSP.PTD_ID_PUNTO = 1044
AND DSP.DSP_FLAG_OK = 1
AND TBL1.FLAG_AUDIO_TESTO=1
AND TBL1.FLAG_AUDIO_GRAFICO=’A’
AND CRS.CRS_STATO>2
--UNION
SELECT ... FROM ...
WHERE TBL1.TBL1_ID IN (
SELECT ID
FROM V_VIEW1
WHERE ID IS NOT NULL
AND V_VIEW1.ID_MODULO = 403721
)
--UNION
SELECT ... FROM ...
WHERE TBL1.TBL1_ID IN (
SELECT TBL1_ID
FROM V_VIEW2
WHERE V_VIEW2.ID_PUNTO = 1044
)
看哪一个是最慢的。
P.S。一分钟的查询非常糟糕。我的观点是查询应该立即返回(在人类观察的范围内)