HSQLDB
500000エントリを含むテーブルを使用してサーバーでいくつかのテストを実行しています。テーブルにはインデックスがありません。5000の異なるビジネスキーがあります。それらのリストが必要です。当然、私はDISTINCT
クエリから始めました:
SELECT DISTINCT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
約90秒かかります!!!
それから私は使ってみましたGROUP BY
:
SELECT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
GROUP BY business_key
そしてそれは1秒かかります!!!
私が実行した違いを理解しようとしていEXLAIN PLAN FOR
ますが、両方のクエリで同じ情報が得られるようです。
EXLAIN PLAN FOR DISTINCT ...
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
EXLAIN PLAN FOR SELECT ... GROUP BY ...
isDistinctSelect=[false]
isGrouped=[true]
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
groupColumns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
編集:私は追加のテストを行いました。500 000レコードがHSQLDB
すべての個別のビジネスキーとともに含まれているため、のパフォーマンスはDISTINCT
3秒向上しましGROUP BY
たが、約9秒かかりました。
ではMySQL
両方のクエリと同じプリフォーム:
MySQL:500 000行-5 000個の個別のビジネスキー:両方のクエリ:0.5秒MySQL:500 000行-すべての個別のビジネスキー:
SELECT DISTINCT ...
-11秒
SELECT ... GROUP BY business_key
-13秒
したがって、問題はにのみ関連していHSQLDB
ます。
なぜこんなに劇的な違いがあるのか、誰かが説明してくれたらとてもありがたいです。
EXPLAIN PLAN
実行後にDISTINCT
クエリを実行して、GROUP BY
キャッシュによってタイミングが歪んでいないかどうかを確認してください...