Reputation: 115
Basically I have an SQL query which is an union of 10 queries like the one below. Why is this query so slow? It is taking me more than a minute to run, and it crashes my form when i use a textbox with DCount on this query.
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
Upvotes: 0
Views: 158
Reputation: 1485
You are already selecting data from ESP_Facturacao
, querying the same table again for the Where
clause is implemented in Access (as in most other RDBMS's) in an inefficient way. You should therefor create an alias on the table name in the Inner query: 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
Upvotes: 1