Tôi đang thực hiện một số thử nghiệm trên HSQLDBmá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 DISTINCTtruy 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 FORnhư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 HSQLDBvới tất cả các khóa nghiệp vụ riêng biệt, hiệu suất của DISTINCTgiờ đây tốt hơn - 3 giây, so với GROUP BYkhoảng 9 giây.
Trong MySQLcả 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 PLANVÀ thử chạy cácDISTINCTtruy 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 ...