こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLチューニングについて

以前別のサイトで質問し、一旦は解決したつもりでしたが、クライアントから再度条件を
突きつけられてしまい、投稿させて頂きました。
(そちら側のサイトでは完了にしてあります。これがマルチスレッドにあたるならご指摘下さい。)

--------------------------------------------------------------------
現在ACCESSにてデータ出力を行なっておりますが、パフォーマンスが出なく悩んでおります。

環境:Windows XP + Access 2003


テーブルA(約18000件)
項目s 項目t 項目u 項目v

★やりたいこと
 テーブルAのうち、項目s,t,uを集約して、集約結果が1件のものを
 対象に全ての項目(s~v)を出力したい。

★現在作成中のSQL
SELECT
sub02.s,
sub02.t,
sub02.u,
sub02.v
FROM
テーブルA AS sub02
INNER JOIN
(
SELECT
s, t, u
FROM テーブルA
GROUP BY
s, t, u
HAVING COUNT(s) = 1
) AS Sub01
ON
Nz(sub01.s)=Nz(sub02.s) AND
Nz(sub01.t)=Nz(sub02.t) AND
Nz(sub01.u)=Nz(sub02.u)


上記SQLで実行すると8~10分程度掛かってしまいます。

結合条件のNZ関数については、どうしてもnullが入る項目がある為に
この様にしてしております。

どなたかお知恵を拝借願いたいと思います。

投稿日時 - 2011-01-31 11:30:55

QNo.6487680

困ってます

質問者が選んだベストアンサー

これではダメでしょうか?

SELECT
sub02.s,
sub02.t,
sub02.u,
--sub02.v
max(sub02.v) AS v
FROM
テーブルA AS sub02
group by
s,t,u
having count(*) = 1;

グルーピング項目でないvをmax(minでも同じ)関数で取得するようにします。
ACCESSは殆ど使ったことがないので的外れかもしれませんが、
テーブルの読込が1回で済むので少しは良くならないでしょうか。

投稿日時 - 2011-01-31 14:30:02

お礼

集約関数でこういった使い方があったとは・・・。

正直、目から鱗でした。

パフォーマンスも数分だったのが、30秒足らずで完了しました。

本当にありがとうございました。

投稿日時 - 2011-01-31 15:15:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

(1)テーブルAに(s,t,u)のインデックスを作成してください。
(2)その上で下記のSQLを実行してみてください。
SELECT *
FROM テーブルA T1
WHERE NOT EXISTS
( SELECT 1 FROM テーブルA T2
WHERE T1.S=T2.S
AND T1.U=T2.U
AND T1.V=T2.V
GROUP BY T1.S,T1.U,T1.V
HAVING COUNT(*)>1 )

投稿日時 - 2011-01-31 15:06:30

あなたにオススメの質問