2016-07-03 7 views
0

基本的に私は以下のような10のクエリの和集合であるSQLクエリを持っています。なぜこのクエリが遅いのですか?実行するのに1分以上かかるので、このクエリで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)WHERE句のNOT IN句をOUTER JOINとより単純な<>句に置き換えます。 –

+0

すべてのテーブルがリンクされています。よりシンプルな<>フレーズは何ですか? –

+2

リンクテーブルを使用するのではなく、パススルーSQLクエリとして書き直します。クエリは〜100回以上高速に実行されます。前回はリンクテーブルを使ってクエリを書き直しましたが、実行時間は18時間***から****** ***になりました。 –

答えて

1

あなたは既にWhere句は非効率的な方法で(他のほとんどのRDBMSのように)Accessで実装されているため、再び同じテーブルを照会し、ESP_Facturacaoからデータを選択しています。 SELECT AA.Item_TAG FROM ESP_Facturacao As AA WHERE (((AA.[1a_MesAno]) Is Not Null)):あなたはそのためのインナークエリ内のテーブル名のaliasを作成する必要があります

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

ありがとう!それは完璧です! –

関連する問題