Я виконую деякі тести на HSQLDB
сервері з таблицею, що містить 500 000 записів. У таблиці немає індексів. Є 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
EDIT : Я зробив додаткові тести. Завдяки 500 000 записів HSQLDB
з усіма чіткими діловими клавішами, продуктивність DISTINCT
тепер краща - 3 секунди, GROUP BY
що зайняло близько 9 секунд.
В MySQL
обох запитах заготовте однаково:
MySQL: 500 000 рядків - 5000 різних бізнес-ключів: Обидва запити: 0,5 секунди MySQL: 500 000 рядків - усі різні бізнес-ключі:
SELECT DISTINCT ...
- 11 секунд
SELECT ... GROUP BY business_key
- 13 секунд
Тож проблема пов’язана лише з HSQLDB
.
Буду дуже вдячний, якщо хтось зможе пояснити, чому існує така різка різниця.
EXPLAIN PLAN
І Спробуйте запуститиDISTINCT
запит ПІСЛЯ запуску,GROUP BY
щоб побачити, чи, можливо, кешування не зміщує час ...