2012-10-18 33 views
11

Chúng tôi có một bảng có hơn hai triệu hàng trong đó tất cả các truy vấn đối với nó sẽ là một tra cứu bằng cách sử dụng Column1Column2. Ngoài ra, sẽ chỉ có một kết quả có thể. Ví dụ ...Lập chỉ mục SQL cho Giữa truy vấn chỉ với một kết quả phù hợp?

Col1  Col2 
1  5 
6  10 
11  15 

select * from table1 where 8 between Col1 and Col2 

Tôi hiện đang có một nhóm chỉ số duy nhất trên Col1Col2. Cho đến nay tôi đã không thể tìm ra cách điều chỉnh thêm truy vấn và các chỉ mục để giảm thiểu các hàng được xử lý. Kế hoạch thực hiện hiện đang báo cáo chi phí của gần 0,5 và 113k hàng được xử lý khi định vị một câu trả lời chính xác và duy nhất.

Tôi có thể xem các tùy chọn nào?

Theo yêu cầu, một số chi tiết từ kế hoạch thực hiện hiện tại:

Operation 
Clustered Index Seek 
Predicate 
CONVERT_IMPLICIT(bigint,[@2],0)<=[Col2] 
Seek Predicate 
Seek Keys[1]: End: Col1 <= Scalar Operator(CONVERT_IMPLICIT(bigint,[@1],0)) 
+0

Bạn có thể viết nó là 'chọn * từ bảng 1 trong đó Col1 = < 8 and Col2> = 8' – Vicki

+0

Bước này luôn luôn là 5 trong Col1? Nếu vậy thì câu trả lời rất đơn giản :) –

+0

Kế hoạch thực hiện bạn trông như thế nào? Bạn có thể thêm câu hỏi đó vào câu hỏi không? –

Trả lời

3

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời. Tôi phải bắt đầu bằng cách tạo một chỉ mục Clustered duy nhất trên Col1, sau đó tạo một Unclustered Index duy nhất trên Col2. Truy vấn sau đó phải được cập nhật để bắt đầu tra cứu trên mỗi Chỉ mục.

select * from table1 where Col1 = 
    (select max(Col1) from table1 where Col1 <= 8) 
and Col2 = 
    (select min(Col2) from table1 where Col2 >= 8) 

Kế hoạch thực hiện hiện báo cáo 0,0098 chi phí và xử lý 1 hàng.

1
select * from table1 where Col1 <= 8 and Col2 >= 8 

Có lẽ "giữa" với hai cột đang gây ra một vấn đề.

Ngoài ra, bạn chỉ nên có 1 chỉ mục tổng hợp trên cả hai cột (Col1, Col2).

6

Các dải ô luôn không chồng chéo? Bạn đề cập rằng luôn có một trận đấu. Nếu có, bạn có thể viết nó như:

SELECT * FROM table1 
    WHERE 8 <= Col2 
    ORDER BY Col2 ASC 
    LIMIT 1 

này sẽ cung cấp cho bạn hàng với giá trị thấp nhất của Col2 đó là trên 8 - đó là phạm vi bạn quan tâm đến Chỉ số duy nhất sẽ là cần thiết trên. Col2 và chi phí phải nhỏ.

Vì bạn không đề cập đến DBMS bạn đang sử dụng, nên thay thế LIMIT 1 bằng bất kỳ thứ gì DB của bạn sử dụng để tìm nạp kết quả đầu tiên.

Bạn sẽ phải kiểm tra Col1 <= your_value trong mã để đảm bảo rằng giá trị bạn đang tìm kiếm thực sự nằm trong phạm vi.

Các vấn đề liên quan