2016-07-03 11 views
0

Grundsätzlich habe ich eine SQL-Abfrage, die eine Union von 10 Abfragen wie die unten ist. Warum ist diese Abfrage so langsam? Es dauert mehr als eine Minute, um auszuführen, und es stürzt mein Formular ab, wenn ich eine Textbox mit DCount für diese Abfrage verwende.Warum ist meine SQL MsAccess-Abfrage so langsam?

SELECT 
ESP_Fisico.ESP_SubTipo_ID, 
ESP_Fisico.ESP_Unidade_ID, 
ESP_Facturacao.Item_TAG, 
MIN(ESP_Facturacao.[1a_MesAno]) AS Data, 
MIN(ESP_Facturacao.[1a_Faturado]) AS Valor, 
'1 a' AS Tarefa, 
'1' AS Control, 
min(ESP_Administrativas.Novo_Pos_2010), 
min(ESP_SubTipo.Descrição) AS SubTipo, 
min(ESP_Unidade.Descricao) AS Unidade, 
min(ESP_Facturacao.ID) 
FROM ESP_Unidade INNER JOIN (((ESP_TAG LEFT JOIN ESP_Facturacao ON ESP_TAG.ID = ESP_Facturacao.ESP_Tag_ID) INNER JOIN (ESP_SubTipo INNER JOIN ESP_Fisico ON ESP_SubTipo.ID = ESP_Fisico.ESP_SubTipo_ID) ON ESP_TAG.ID = ESP_Fisico.ESP_Tag_ID) INNER JOIN ESP_Administrativas ON ESP_TAG.ID = ESP_Administrativas.ESP_Tag_ID) ON ESP_Unidade.ID = ESP_Fisico.ESP_Unidade_ID 
WHERE (((ESP_Facturacao.Item_TAG) Not In 
(SELECT ESP_Facturacao.Item_TAG 
FROM ESP_Facturacao 
WHERE (((ESP_Facturacao.[1a_MesAno]) Is Not Null)))) 
AND ((ESP_Administrativas.Data_Aut_Funcion) Is Null)) 
Group By ESP_Facturacao.Item_TAG, ESP_Fisico.ESP_SubTipo_ID, ESP_Fisico.ESP_Unidade_ID, ESP_Facturacao.Item_TAG 
+0

1) Verwenden Sie alle verknüpften Tabellen? 2) Ersetzen Sie den NOT IN-Ausdruck Ihrer WHERE-Klausel durch einen OUTER JOIN und einen einfacheren <> Ausdruck. –

+0

Alle Tabellen sind verknüpft. Was ist eine einfachere <> Phrase? –

+2

Rewrite als Pass-Through-SQL-Abfrage anstelle von verknüpften Tabellen - Ihre Abfragen werden ca. 100 Mal oder schneller ausgeführt. Das letzte Mal, als ich eine Abfrage mit verknüpften Tabellen neu geschrieben habe, ging die Laufzeit von 18 *** Stunden *** auf 120 *** Sekunden ***. –

Antwort

1

Sie sind bereits Daten von ESP_Facturacao Auswahl wieder die gleiche Tabelle Abfrage für die Where-Klausel wird in Access (wie in den meisten anderen RDBMS) in einer ineffizienten Weise umgesetzt. Sie sollten dafür einen alias auf den Tabellennamen in der inneren Abfrage erstellen: SELECT AA.Item_TAG FROM ESP_Facturacao As AA WHERE (((AA.[1a_MesAno]) Is Not Null)):

SELECT 
ESP_Fisico.ESP_SubTipo_ID, 
ESP_Fisico.ESP_Unidade_ID, 
ESP_Facturacao.Item_TAG, 
MIN(ESP_Facturacao.[1a_MesAno]) AS Data, 
MIN(ESP_Facturacao.[1a_Faturado]) AS Valor, 
'1 a' AS Tarefa, 
'1' AS Control, 
min(ESP_Administrativas.Novo_Pos_2010), 
min(ESP_SubTipo.Descrição) AS SubTipo, 
min(ESP_Unidade.Descricao) AS Unidade, 
min(ESP_Facturacao.ID) 
FROM ESP_Unidade INNER JOIN (((ESP_TAG LEFT JOIN ESP_Facturacao ON ESP_TAG.ID = ESP_Facturacao.ESP_Tag_ID) INNER JOIN (ESP_SubTipo INNER JOIN ESP_Fisico ON ESP_SubTipo.ID = ESP_Fisico.ESP_SubTipo_ID) ON ESP_TAG.ID = ESP_Fisico.ESP_Tag_ID) INNER JOIN ESP_Administrativas ON ESP_TAG.ID = ESP_Administrativas.ESP_Tag_ID) ON ESP_Unidade.ID = ESP_Fisico.ESP_Unidade_ID 
WHERE (((ESP_Facturacao.Item_TAG) Not In 
(SELECT AA.Item_TAG FROM ESP_Facturacao As AA 
WHERE (((AA.[1a_MesAno]) Is Not Null)))) 
AND ((ESP_Administrativas.Data_Aut_Funcion) Is Null)) 
Group By ESP_Facturacao.Item_TAG, ESP_Fisico.ESP_SubTipo_ID, ESP_Fisico.ESP_Unidade_ID, ESP_Facturacao.Item_TAG 
+0

Vielen Dank! Es ist perfekt! –