2011-01-05 32 views
6

Có bất kỳ sự khác biệt (Perf) thành văn bản yêu cầu này:Có sự khác biệt nào giữa '=' và Trong?

Select * from T where PK = 1 

hay này

Select * from T where PK in (1) 

Tôi tin không nhưng tôi thực sự không biết làm thế nào để dispay một kế hoạch thực hiện mà nên khẳng định cảm giác của tôi .

Thx trước

+1

Tôi hy vọng rằng trình tối ưu hóa sẽ nhận ra rằng chỉ có một giá trị duy nhất trong danh sách 'IN' của bạn và xử lý nó giống như nó sẽ' = '. – LukeH

+0

Vì vậy, làm I. Nhưng làm thế nào tôi có thể khẳng định nó? –

Trả lời

3

IN biểu:

Column in (Val1,Val2,Val3) 

là nội viết lại thành một cái gì đó rất giống với:

(Column = Val1 or Column = Val2 or Column = Val3) 

Bạn có thể nói điều này bởi vì, nếu bạn cung cấp tên của một cột không tồn tại, các số lỗi được báo cáo (Invalid Column name 'Blah') bằng với số lượng giá trị trong danh sách IN. Tất nhiên, việc viết lại này chỉ xảy ra cho các danh sách các giá trị theo nghĩa đen. Các truy vấn phụ (như @oezi nói) được xử lý khác nhau.


Tất nhiên, tối ưu hóa cụ thể này không được ghi lại và luôn ưu tiên viết mã rõ ràng nhất có thể.

Tôi không chắc chắn nếu có giới hạn trên, nơi nó sẽ không thực hiện mở rộng này - chắc chắn sẽ làm điều đó lên đến 100 giá trị trong danh sách IN (và tôi không thể làm phiền để nhập nhiều hơn).

3

trong trường hợp của bạn: không có sự khác biệt

nói chung: bạn có thể viết một subselect hoặc bên trong niềng răng, và = sẽ thất bại nếu subselect trả hơn 1 hàng. ngoài ra, bạn có thể viết (1,2) (giống như một vùng chọn có trả về 2 hàng), ở đó cũng không thể thực hiện được =.

+0

Thx, tôi biết cách sử dụng và '='. Tôi chỉ tự hỏi nếu có sự khác biệt hoàn hảo –

-1

Toán tử so sánh so sánh hai giá trị cho bình đẳng là cách nhanh nhất để so sánh.

"Select * from T nơi PK = 1"

sẽ phôi nhanh hơn nhiều so:

"Select * from T nơi PK trong (1)"

một giống như:

"SELECT customer_number, customer_name FROM customer WHERE customer_number GIỮA 1000 và 1004"

sẽ tạo phôi nhanh hơn nhiều:

"SELECT CUSTOMER_NUMBER, customer_name TỪ khách hàng ĐÂU CUSTOMER_NUMBER trong (1000, 1001, 1002, 1003, 1004)"

Optimizer truy vấn có thể xác định vị trí một dải số nhanh hơn nhiều (sử dụng GIỮA) so với nó có thể tìm thấy một loạt các số sử dụng mệnh đề IN.

+1

Ok, nhưng làm thế nào bạn có thể đề xuất nó? –

+0

Ok, Damien_The_Unbeliever đã đúng, tôi vừa kiểm tra kế hoạch thực hiện rằng "Select * from T trong đó PK in (1)" được thực hiện/dịch là "Select * from T where PK = 1", có nghĩa là trình tối ưu hóa truy vấn đã thực hiện công việc của mình. Các truy vấn con trong mệnh đề IN được xử lý khác nhau. – HABJAN

+0

Chỉ điều có thể nhanh hơn nếu khi truy vấn được phân tích cú pháp. :-) – HABJAN

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