内部联接与大表减慢查询

时间:2017-06-13 16:13:23

标签: sql-server sql-server-2008-r2 query-performance

我的应用程序对特定客户执行的查询非常慢。 我意识到客户在一张桌子上有很多记录。

查询是这样的

SELECT T1.Field1,BT.Field2, T3.Field3
FROM TABLE1 T1 INNER JOIN
BIGTABLE BT ON FIELDS INNER JOIN
TABLE2 T2 ON FIELDS

我注意到这样的评论结果更快了:

SELECT T1.Field1,/*BT.Field2,*/ T3.Field3
FROM TABLE1 T1 /*INNER JOIN
BIGTABLE BT ON FIELDS*/ INNER JOIN
TABLE2 T2 ON FIELDS

所以我尝试了这个技巧来减少BIGTABLE的大小:

--I use top 10 while the BIGTABLE contains 150000 records
SELECT top 10 * 
INTO #BIGTABLE
FROM BIGTABLE

SELECT T1.Field1,BT.Field2, T3.Field3
FROM TABLE1 T1 INNER JOIN
#BIGTABLE BT ON FIELDS INNER JOIN
TABLE2 T2 ON FIELDS

DROP TABLE #BIGTABLE

在执行此操作之前,我期待更快的查询,但执行时间非常相似。 你能建议一种研究表现的方法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

要研究表现,你可以做几件事:

如果您从SSMS运行查询,则只需在运行查询之前包含实际执行计划(检查工具栏中的小图标)并运行它。看看sqlplan或者你可以在这里发布它。有时可能会出现“表扫描”或其他导致运行缓慢的资源消耗操作。该计划将帮助您了解。

除了你的查询之外,服务器上还可以运行其他东西。过去我使用Who Is Active Script from Adam Machanic来查找其他东西让服务器忙碌。查看您的SPID是否被其他查询阻止(如果您运行Adam的脚本,它会有一个blocking_session列,可以向您显示)。您需要几乎DBA权限才能运行该脚本。有些人不建议经常在生产服务器上运行此脚本。

您可以使用“WITH(READUNCOMMITED)”提示来查看是否有帮助。如果您不希望在查询中看到脏数据,则不建议这样做。