内部加入大表减慢查询
我的应用程序对特定客户执行的查询非常缓慢。 我意识到客户在一张桌子上有很多记录。内部加入大表减慢查询
查询是这样的
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
执行此操作之前,我期待更快的查询,但执行时间非常相似。 你能否建议一种研究表现的方法?
谢谢。
研究的性能,你可以做几件事情:
如果您运行从SSMS查询然后简单地包括实际的执行计划(请在工具栏上的小图标)运行查询之前,并运行它。看看sqlplan或者你可以在这里发布它。有时会出现“表扫描”或其他耗费资源的操作,导致缓慢。该计划将帮助你理解。
除了您的查询之外,服务器上还可能运行其他功能,在过去,我使用Who Is Active Script from Adam Machanic来查找其他什么使服务器保持忙碌状态。看看你的SPID是否被其他查询阻止(如果你运行亚当的脚本,它有一个blocking_session列会告诉你)。您几乎需要DBA权限才能运行该脚本。有些人不建议经常在生产服务器上运行这个脚本。
您可以使用“WITH(READUNCOMMITED)”提示来查看是否有帮助。如果您不希望在查询中看到脏数据,则不推荐这样做。
嗨。谢谢回复。我在这里贴上了这个计划https://www.brentozar.com/pastetheplan/?id=B1MIB96Mb你能说点什么吗? – LaBracca
EVA_REFERENCES是大表 – LaBracca
如果你只需要选择MF.ID_FUNZIONE和PA.ID_DIPENDENTE那么你可以尝试此查询: '从 选择MF.ID_FUNZIONE,PA.ID_DIPENDENTE PER_ANAGRAFICA PA INNER JOIN MSQ_PERS_FUNZIONI强积金强积金。 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 \t \t \t \t APP_SSHSR APP ON APP.ID_REF_IS_SS_PERIODICO_MANSIONI = ER.ID_EVA_REFERENCE_TYPES \t \t \t \t哪里ER。ID_FOR_ALL = MF.ID_FUNZIONE)' – Nachi
您可能只需要在连接中使用的列索引。 –
我不认为150,000条记录是一个“大”表,特别是对于SQL Server。你能发布执行计划吗?可能是任何事情,但统计数据或索引可能关闭。如果您加入未索引的大型varchar字段,您也将遇到不好的时间。 –
在这里观看前两部(或所有)视频:这将帮助你大量:https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-开源/ –