2012-02-28 49 views
28

Giả sử ai đó đã đến với bạn và nói rằng chúng tôi sẽ cắt giảm số lượng SQL mà chúng tôi viết bằng cách thay thế bằng IN. Việc sử dụng sẽ là cả hai cho các giá trị vô hướng đơn và danh sách các số.câu lệnh sql bằng với số

SELECT * 
    FROM table 
WHERE id = 1 

HOẶC

SELECT * 
    FROM table 
WHERE id IN (1) 

Là những tuyên bố tương đương với những gì tôi ưu hoa sản xuất? Điều này trông thực sự đơn giản trên bề mặt, nhưng nó dẫn đến đơn giản vì hai lý do: 1. khối lớn SQL không cần phải được nhân đôi, và 2. chúng tôi không lạm dụng SQL động.

Đây là một ví dụ được tạo ra, nhưng hãy xem xét những điều sau đây.

select a.* from tablea a 
join tableb b on a.id = b.id 
join tablec c on b.id2 = c.id2 
left join tabled d on c.id3 = c.id3 
where d.type = 1 

... và giống nhau một lần nữa cho nhiều hơn một trường hợp

select a.* from tablea a 
join tableb b on a.id = b.id 
join tablec c on b.id2 = c.id2 
left join tabled d on c.id3 = c.id3 
where d.type in (1,2,3,4) 

(đây không phải là ngay cả một tuyên bố lớn)

hình dung bạn có thể làm chuỗi nối, nhưng điều này là không mong muốn trong ánh sáng của việc sử dụng ORM, và chuỗi nối động SQL luôn luôn bắt đầu với ý định tốt (ít nhất là trong các phần này).

+0

Chúng phải tương đương nhau. Hãy xem kế hoạch thực hiện để chắc chắn. –

+0

Tôi nghĩ rằng có nhiều thứ phù hợp hơn để tập trung vào vấn đề này, như bí danh bảng, không sử dụng 'SELECT *', v.v. Kế hoạch truy vấn là điều duy nhất sẽ cho bạn biết trình tối ưu hóa thấy gì và nó có thể thay đổi dựa trên chỉ mục và thống kê. –

+0

Tôi đã thử nghiệm trên 6 triệu bảng hàng. Và bị ảnh hưởng hàng là 150 nghìn hàng.Câu trả lời đều giống nhau. – shenhengbin

Trả lời

21

Cả hai sẽ tạo cùng một kế hoạch thực hiện - hoặc là table scan, index scan hoặc index seek, tùy thuộc vào việc/nếu bạn đã lập chỉ mục bảng của mình.

Bạn có thể tự mình xem - Displaying Graphical Execution Plans (SQL Server Management Studio) - Xem phần có tên "Sử dụng tùy chọn gói thực thi".

15

Hai báo cáo cụ thể tương đương với tôi ưu hoa (bạn đã so sánh kế hoạch thực hiện?), Nhưng tôi nghĩ rằng lợi ích quan trọng hơn bạn thoát ra khỏi cái sau là

WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 

Có thể được biểu thị bằng sau đó, nhiều súc tích hơn và có thể đọc được (nhưng ngữ nghĩa tương đương với tôi ưu hoa) phiên bản:

WHERE id IN (1,2,3,4,5) 

vấn đề là khi thể hiện như sau này hầu hết mọi người nghĩ rằng họ có thể vượt qua một chuỗi, như @list = '1,2,3,4,5' và sau đó nói:

WHERE id IN (@list) 

Điều này không hoạt động vì @list là một chuỗi vô hướng duy nhất và không phải là một dãy số nguyên.

Đối với trường hợp bạn có một giá trị duy nhất, tôi không thấy cách "tối ưu hóa" đó giúp gì cả. Bạn chưa viết ít SQL, bạn đã thực sự viết nhiều hơn. Bạn có thể phác thảo chi tiết hơn như thế nào điều này sẽ dẫn đến SQL ít hơn?

+0

không có SQL Server trước mặt tôi ngay bây giờ. Tôi cần một ý kiến ​​từ thế giới SQL Server trước khi tôi tiến hành. tức là không muốn thực hiện thay đổi cụ thể DBMS như thế này mà không cần kiểm tra sự tỉnh táo. Cảm ơn rất nhiều. – sgtz

+0

Vẫn đồng ý với những người khác rằng dường như không có điều gì hợp lý để thay đổi, mục đích là gì? Không có những điều quan trọng hơn để tập trung vào đó xen kẽ giữa cú pháp tương đương? –

+0

re: less SQL. Nói câu lệnh khá lớn với rất nhiều kết nối. Nó sẽ có ít SQL hơn vì toàn bộ khối đó sẽ không bị trùng lặp, và bạn cũng không cần phải làm và tạo thành phần động. – sgtz

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