クエリ説明:COUNT(1)+ COUNT(DISTINCT())2つのクエリを実行次に、はるかに遅いが別々
Person
(PersonID
により同定)が持っているか、(JobID
によって識別される)対応Job
を有していなくてもよいです。- 対応する
Job
がある場合、結合は表PersonJob
(PersonID
< =>JobID
)に格納されます。 Person
Job
を指定しない場合は無視されます。Job
もまた、CityID
を有する。すべてのJob.CityID
パー- 、クエリが
Person
の合計数を知っているとも
Person.HouseID
ユニークなクエリのカウントしたい:
SELECT
Job.CityID, COUNT(1) NumTotal, COUNT(DISTINCT(Person.HouseID)) NumDistinct
FROM
Job
INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID)
INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID)
GROUP BY
Job.CityID
統計:
SELECT COUNT(1) FROM PersonJob
〜600.000SELECT COUNT(1) FROM Person
〜800.000SELECT COUNT(DISTINCT(Person.HouseID)) FROM Person
〜10.000SELECT COUNT(1) FROM Job
〜500- MS SQL Serverの10.50
問題:
COUNT(1)
クエリの一部、個別に実行、0.25secで実行されます。SELECT Job.CityID, COUNT(1) NumTotal FROM Job INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID) INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID) GROUP BY Job.CityID
COUNT(DISTINCT(Person.HouseID))
個別に実行クエリの一部は、0.80secで実行されます。 3倍遅く、なぜ -SELECT Job.CityID, COUNT(DISTINCT(Person.HouseID)) NumDistinct FROM Job INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID) INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID) GROUP BY Job.CityID
クエリ全体は3.10secで実行されますか?
実行計画:
- 私は申し訳ありませんが、それらを読み取るには専門家です。
- 私の知る限り、問題はCOUNT(DISTINCT)内にある
- 部分クエリで:
- 25%のハッシュが一致(集約)(出力
Job.CityID
) - 15%のハッシュが一致(インナー参加)(出力
Job.CityID
、Person.HouseID
)- 30%のインデックス・スキャン(出力
Person.PersonID
、Person.HouseID
) - 14%インデックス(求めて出力
PersonJob.PersonID
)
完全クエリで
- 30%のインデックス・スキャン(出力
- 25%のハッシュが一致(集約)(出力
- :
- 03パーセントのハッシュ一致(部分集合体)(出力
Job.CityID
、COUNT(*)
) - 31%のハッシュ一致(集計)(出力
Job.CityID
) - 29%テーブルスプール(出力
Job.CityID
,Person.HouseID
)
- 03パーセントのハッシュ一致(部分集合体)(出力
あなたの比較は 'join'sを使用していますか? –
あなたが何を意味するのかわからない、おそらく部分的なクエリですか?それらを追加しました。 – Codeguard
無関係ですが、: 'distinct'は***ではありません*** ***関数です。 'distinct(Person.HouseID)'は**完全に** distinct Person.HouseID'と同じものです –