Không, điều này có thể không chính xác.
Nếu bạn có một bảng lớn, Oracle
có thể thích phát sinh các trường từ chỉ mục hơn là từ bảng, thậm chí không có chỉ mục duy nhất bao gồm tất cả các giá trị.
Trong bài viết mới nhất trong blog của tôi:
, có một truy vấn trong đó Oracle
không sử dụng đầy đủ bảng quét nhưng thay vì tham gia hai chỉ số để có được các giá trị cột:
SELECT l.id, l.value
FROM t_left l
WHERE NOT EXISTS
(
SELECT value
FROM t_right r
WHERE r.value = l.value
)
Kế hoạch này là:
SELECT STATEMENT
HASH JOIN ANTI
VIEW , 20090917_anti.index$_join$_001
HASH JOIN
INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID
INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE
INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE
Như bạn có thể thấy, không có TABLE SCAN
trên t_left
tại đây.
Thay vào đó, Oracle
mất các chỉ số trên id
và value
, gia nhập chúng trên rowid
và nhận được (id, value)
cặp từ kết quả tham gia.
Bây giờ, để truy vấn của bạn:
SELECT *
FROM some_table
WHERE field_one is not null and field_two = ?
GROUP BY
field_three, field_four, field_five
Thứ nhất, nó sẽ không biên dịch, vì bạn đang chọn *
từ một bảng với một điều khoản GROUP BY
.
Bạn cần thay thế *
bằng các biểu thức dựa trên các cột nhóm và tổng hợp của các cột không nhóm.
Bạn có lẽ hầu hết sẽ được hưởng lợi từ các chỉ số sau:
CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)
, vì nó sẽ chứa tất cả mọi thứ cho cả lọc trên field_two
, phân loại trên field_three, field_four, field_five
(hữu dụng cho GROUP BY
) và đảm bảo rằng field_one
là NOT NULL
.
+1 để đề cập đến trình tối ưu hóa, đây có thể là nguyên nhân có khả năng nhất của việc này. –
Cảm ơn bạn đã phản hồi. Tôi không nhận ra kế hoạch giải thích phụ thuộc vào lượng dữ liệu trong bảng. Hiện không có dữ liệu nào trong bảng, điều này giải thích tại sao trình tối ưu hóa có thể đã bỏ qua các chỉ mục khác. Trên một lưu ý khác, chỉ mục tổng hợp trên field_three và field_four không có field_five vẫn được sử dụng trong truy vấn giống như ở trên? Điều này sẽ không bao gồm tất cả các trường trong nhóm theo mệnh đề. – onejigtwojig
@Mark - giải thích điều đó. Xem các chỉnh sửa của tôi để biết thêm thông tin về những chỉ mục mà Oracle có thể sử dụng cho nhóm. –