与大表的内部联接减慢查询
Posted
技术标签:
【中文标题】与大表的内部联接减慢查询【英文标题】:Inner join with big table slowing down query 【发布时间】:2017-06-13 16:13:23 【问题描述】:我的应用程序对特定客户执行的查询非常慢。 我意识到客户有很多记录,特别是在一张表中。
查询是这样的
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
在执行此操作之前,我期待一个更快的查询,但执行时间非常相似。 您能否建议一种研究性能的方法?
谢谢。
【问题讨论】:
您可能只需要连接中使用的列的索引。 我不会认为 150,000 条记录是一个“大”表,尤其是对于 SQL Server。你能发布执行计划吗?可以是任何东西,但统计数据或索引可能会关闭。还要发布架构,如果您要加入未索引的大型 varchar 字段,您将度过一段糟糕的时光。 在此处观看前 2 个(或所有)视频:这将对您有很大帮助:brentozar.com/archive/2016/10/… 连接列的类型是什么?连接是基于平等的吗?哪些列是正在连接的表的索引? 【参考方案1】:要研究性能,您可以做几件事:
如果您从 SSMS 运行查询,则只需在运行查询之前包含实际执行计划(检查工具栏中的小图标)并运行它。看看 sqlplan 或者你可以把它贴在这里。有时可能会出现“表扫描”或其他导致缓慢的资源消耗操作。该计划将帮助您理解。
除了您的查询之外,服务器上可能还运行着其他东西,过去我使用Who Is Active Script from Adam Machanic 来查找导致服务器忙碌的其他东西。查看您的 SPID 是否被其他查询阻止(如果您运行 Adam 的脚本,它有一个 blocking_session 列将向您显示)。您几乎需要 DBA 权限才能运行该脚本。有些人不建议经常在生产服务器上运行此脚本。
您可以使用“WITH (READUNCOMMITED)”提示来查看是否有帮助。如果您不想在查询中看到脏数据,则不建议这样做。
【讨论】:
嗨。谢谢回复。我把计划贴在这里brentozar.com/pastetheplan/?id=B1MIB96Mb你能说点什么吗? EVA_REFERENCES 是大表 如果你只想选择 MF.ID_FUNZIONE 和 PA.ID_DIPENDENTE 那么你可以试试这个查询:select MF.ID_FUNZIONE,PA.ID_DIPENDENTE from PER_ANAGRAFICA PA INNER JOIN MSQ_PERS_FUNZIONI MPF ON MPF.ID_DIPENDENTE = PA.ID_DIPENDENTE AND PA.STATO = 1 INNER JOIN MSQ_FUNZIONI MF ON MF.ID_FUNZIONE = MPF.ID_FUNZIONE WHERE EXISTS (SELECT 1 FROM EVA_REFERENCES ER INNER JOIN APP_SSHSR APP ON APP.ID_REF_IS_SS_PERIODICO_MANSIONI = ER.ID_EVA_REFERENCE_TYPES WHERE ER.ID_FOR_ALL = MF.ID_FUNZIONE )
以上是关于与大表的内部联接减慢查询的主要内容,如果未能解决你的问题,请参考以下文章