Tôi đang thực hiện một số thử nghiệm trên HSQLDB
máy chủ có bảng chứa 500 000 mục nhập. Bảng không có chỉ số. Có 5000 khóa kinh doanh riêng biệt. Tôi cần một danh sách trong số họ. Đương nhiên, tôi bắt đầu với một DISTINCT
truy vấn:
SELECT DISTINCT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
Nó mất khoảng 90 giây !!!
Sau đó, tôi đã thử sử dụng GROUP BY
:
SELECT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
GROUP BY business_key
Và mất 1 giây !!!
Cố gắng tìm ra sự khác biệt mà tôi đã chạy EXLAIN PLAN FOR
nhưng dường như nó cung cấp cùng một thông tin cho cả hai truy vấn.
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
CHỈNH SỬA : Tôi đã làm các bài kiểm tra bổ sung. Với 500 000 bản ghi HSQLDB
với tất cả các khóa nghiệp vụ riêng biệt, hiệu suất của DISTINCT
giờ đây tốt hơn - 3 giây, so với GROUP BY
khoảng 9 giây.
Trong MySQL
cả hai truy vấn đều giống nhau:
MySQL: 500 000 hàng - 5000 khóa nghiệp vụ riêng biệt: Cả hai truy vấn: 0,5 giây MySQL: 500 000 hàng - tất cả các khóa nghiệp vụ riêng biệt:
SELECT DISTINCT ...
- 11 giây
SELECT ... GROUP BY business_key
- 13 giây
Vì vậy, vấn đề chỉ liên quan đến HSQLDB
.
Tôi sẽ rất biết ơn nếu ai đó có thể giải thích tại sao lại có sự khác biệt lớn như vậy.
EXPLAIN PLAN
VÀ thử chạy cácDISTINCT
truy vấn sau khi bạn chạyGROUP BY
để xem liệu có lẽ một số bộ nhớ đệm được làm lệch thời gian ...