2012-12-06 95 views
4

我有它需要20秒來執行,按照我的查詢的查詢:差異以子查詢

SELECT MATLIGA.COD_MAT_FAMILIA 
FROM 
    ORCAMENTOS.dbo.OR_1INSUMOS INSUMOS 
    INNER JOIN ORCAMENTOS.dbo.OR_MAT_GRUPOS GRUPOS ON (GRUPOS.EMPRESA='01' AND GRUPOS.FILIAL='01' AND GRUPOS.CODIGO_INTERNO = 'HOT') 
    INNER JOIN ORCAMENTOS.dbo.OR_MATERIAIS MATER ON (MATER.EMPRESA='01' AND MATER.FILIAL='01' AND MATER.CODIGO_GRUPO=GRUPOS.ID AND MATER.ID = INSUMOS.COD_INSUMO_MATER) 
    INNER JOIN ORCAMENTOS.dbo.OR_MAT_LIGACAO MATLIGA ON (MATLIGA.EMPRESA='01' AND MATLIGA.FILIAL='01' AND MATLIGA.CODIGO_MATERIAL = INSUMOS.COD_INSUMO_MATER) 
WHERE INSUMOS.EMPRESA='01' AND INSUMOS.FILIAL='01' 
AND INSUMOS.COD_INSUMO_MATER IS NOT NULL 
AND INSUMOS.NUMERO=10865812 
AND INSUMOS.OPCAO_SIMULACAO=1 
AND INSUMOS.CODIGO_MAQUINA = (SELECT COD_MAQ_PROPOSTA FROM ORCAMENTOS.dbo.OR_1SIMULACOES AS ORC WHERE ORC.NUMERO=10865812 AND ORC.OPCAO_SIMULACAO = 1 AND ORC.EMPRESA='01' AND ORC.FILIAL='01') 
AND INSUMOS.OPCAO_MAQUINA = (SELECT OPCAO_MAQUINA FROM ORCAMENTOS.dbo.OR_1SIMULACOES AS ORC WHERE ORC.NUMERO=10865812 AND ORC.OPCAO_SIMULACAO = 1 AND ORC.EMPRESA='01' AND ORC.FILIAL='01') 
GROUP BY MATLIGA.COD_MAT_FAMILIA 
ORDER BY 1 

在這兩行波紋管,如果我改變由等於信號( IN),(= ALL)或(= ANY),它將成本降低到1秒。

AND INSUMOS.CODIGO_MAQUINA IN (SELECT COD_MAQ_PROPOSTA FROM ORCAMENTOS.dbo.OR_1SIMULACOES AS ORC WHERE ORC.NUMERO=10865812 AND ORC.OPCAO_SIMULACAO = 1 AND ORC.EMPRESA='01' AND ORC.FILIAL='01') 
AND INSUMOS.OPCAO_MAQUINA IN (SELECT OPCAO_MAQUINA FROM ORCAMENTOS.dbo.OR_1SIMULACOES AS ORC WHERE ORC.NUMERO=10865812 AND ORC.OPCAO_SIMULACAO = 1 AND ORC.EMPRESA='01' AND ORC.FILIAL='01') 

它們之間有什麼區別?

Tks。

+0

什麼是執行計劃說明了什麼? – jbl

+0

您是否查看過執行計劃digrams以查看查詢的teo版本之間的差異?顯而易見的邏輯區別在於'IN'可以接受多個結果來比較'='強制子查詢只返回一個結果的位置。不知道在執行差異方面意味着什麼。 – Penfold

+0

這可能意味着SQL必須檢查子查詢只返回1行,而不需要'IN'這樣的檢查。 – Jamiec

回答

7

有一個小的語義差異。如果子查詢匹配多個記錄,則第一個查詢必須失敗。因此,它必須完成的子查詢,直到最後:

where col1 = (select col1 from table2) 

第二個查詢可以停止一旦遇到匹配:

where col1 in (select col1 from table2) 
+0

很棒的觀察:D –