2016-07-03 67 views
0

基本上我有一个SQL查询,它是10个查询的联合,如下所示。为什么这个查询很慢?它花了我一分多时间运行,并且当我在此查询中使用带有DCount的文本框时,它崩溃了我的表单。为什么我的SQL MsAccess查询如此缓慢?

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)你使用任何链接的表? 2)用OUTER JOIN和一个简单的<>短语替换WHERE子句的NOT IN短语。 –

+0

所有表格都已链接。什么是简单的<>短语? –

+2

重写为传递SQL查询而不是使用链接表 - 您的查询将运行约100倍或更多,速度更快。上次我使用链接表重写了一个查询,运行时间从18 ***小时***变为120 ***秒***。 –

回答

1

您已经为Where条款从ESP_Facturacao选择数据,查询同桌再次在Access中实现(如在大多数其他的RDBMS)的方式效率极低。您应该为此创建的表名的alias在内部查询: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

非常感谢!这十分完美! –

相关问题