与大表的内部联接减慢查询

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 )

以上是关于与大表的内部联接减慢查询的主要内容,如果未能解决你的问题,请参考以下文章

了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表

Mysql + 大表 = 慢查询?

加入大表时,postgres 查询速度慢

SQL Server-交叉联接内部联接基础回顾

大表上的第一次查询调用速度非常慢

查询执行时间是不是因大表的不同查询参数值而异?