调整昂贵的查询

时间:2016-06-01 14:47:18

标签: sql performance

我有一个问题:

SELECT MIN(Numero) 
FROM view_OperatoriCpuLiberi 
WHERE IDCpu = '9e2da792-be47-e311-aea8-b4b52fb677e0' 
AND Numero > 100 AND IDGruppo IN 
(
    SELECT AssociazioniCampo.IDOggetto AS IDGruppiAutorizzati 
    FROM Anag.ListeAssociazioni 
    INNER JOIN Anag.AssociazioniCampo ON ListeAssociazioni.IDLista = AssociazioniCampo.IDLista 
    INNER JOIN Campo.Oggetti ON AssociazioniCampo.IDOggetto = Oggetti.IDOggetto 
    WHERE ListeAssociazioni.IDTipoMacroOggetto = 5 
    AND ListeAssociazioni.IDTipoAssociatoCampo = 74 
    AND Deleted = 0 
    AND IDMacroOggetto = 'c3f2c542-a195-11e0-a2e3-000c2962b9f0'
)

'view_OperatoriCpuLiberi'包含81981行和嵌套查询(括号内)861行。查询耗时超过2秒。如果我删除嵌套查询然后'IDGruppo IN'指令它变得非常快。我能做什么?

1 个答案:

答案 0 :(得分:1)

这就是我可能会编写此查询的方式,但它是否表现更好可能取决于索引的编写方式等。

你没有在所有列上使用别名,所以我不得不猜测它们中的一些来自哪里。

SELECT
    MIN(OCL.Numero) 
FROM
    view_OperatoriCpuLiberi OCL -- Ugh. Object name prefixes are evil.
INNER JOIN Anag.AssociazioniCampo AC ON
    AC.IDOggetto = OCL.IDGruppo
INNER JOIN Anag.ListeAssociazioni LA ON
    LA.IDLista = AC.IDLista AND
    LA.IDTipoMacroOggetto = 5 AND
    LA.IDTipoAssociatoCampo = 74 AND
    LA.Deleted = 0 AND
    LA.IDMacroOggetto = 'c3f2c542-a195-11e0-a2e3-000c2962b9f0'
INNER JOIN Campo.Oggetti O ON O.IDOggetto = AC.IDOggetto
WHERE
    OCL.IDCpu = '9e2da792-be47-e311-aea8-b4b52fb677e0' AND
    OCL.Numero > 100 AND

您至少应该拥有表之间所有外键的索引。