Có phải ai đó WHERE 1 = 1 không thường có ảnh hưởng đến hiệu năng truy vấn?


19

Gần đây tôi đã thấy câu hỏi "trong đó 1 = 1 tuyên bố" ; một cấu trúc SQL mà tôi đã sử dụng thường xuyên trong việc xây dựng SQL động nhằm nỗ lực viết mã sạch hơn (từ quan điểm của ngôn ngữ máy chủ).

Nói chung, việc bổ sung vào một thống kê SQL có ảnh hưởng tiêu cực đến hiệu năng truy vấn không? Tôi không tìm kiếm câu trả lời liên quan đến một hệ thống cơ sở dữ liệu cụ thể (vì tôi đã sử dụng nó trong DB2, SQL Server, MS-Access và mysql) - trừ khi không thể trả lời mà không đi vào chi tiết cụ thể.


4
Tôi tin rằng bất kỳ trình tối ưu hóa nào cũng có thể xử lý điều kiện đơn giản như vậy và chỉ cần bỏ qua nó để kế hoạch thực hiện cuối cùng hoàn toàn không chứa nó

Tôi cũng nghĩ vậy-- nói một cách logic, có vẻ như có ý nghĩa rằng nói chung một trình tối ưu hóa truy vấn sẽ đơn giản bỏ qua nó.

6
Bạn có thể so sánh kế hoạch thực hiện wtih và không có1=1
Luc M

4
@Luc M: Tôi đã làm điều đó cho SQLite. Hóa ra nó không tối ưu hóa các WHILE 1=1điều khoản. Tuy nhiên, nó dường như không có bất kỳ tác động có thể phát hiện nào về thời gian thực hiện.
dan04

Câu trả lời:


23

Tất cả các RDBMS chính, theo như tôi biết, đã được xây dựng trong các đánh giá liên tục. Điều này sẽ đánh giá khá nhiều ngay lập tức trong bất kỳ trong số họ.


+1 Đây cũng là dự đoán của tôi, nhưng lý do tôi đặt câu hỏi là để có thêm một chút chi tiết. Tôi sẽ giữ nó mở lâu hơn một chút để xem liệu tôi có nhận thêm đầu vào nào không.
bóng bán

2
Điều này được bỏ qua. Nó không là gì với trình tối ưu hóa, chỉ là concat của nơi kết hợp theo liên kết trong câu hỏi (câu trả lời của tôi cũng vậy)
gbn

8

Từ phối cảnh máy chủ SQL nếu bạn đang thực hiện việc WHERE 1=1cho phép truyền động các tham số động và bỏ qua một tham số khỏi bị đánh giá, tôi sẽ đề nghị bạn đọc một vài bài viết từ SQL Server MV Erland Sommarskog. Cách tiếp cận của anh ta loại bỏ sự cần thiết phải thực hiện một số thủ thuật khác bên trong SQL động (như WHERE Column = Columncấu trúc hoặc sử dụng WHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)cấu trúc). 1 = 1 không nên gây ra các vấn đề về hiệu suất như @JNK đã đề cập (Tôi đã trả lời câu trả lời của anh ấy ở đó và đó là câu trả lời nên được chấp nhận), tôi nghĩ bạn sẽ tìm thấy một số mẹo hay từ bài viết của Erland SQL động và bạn cũng sẽ thấy anh ta vẫn sử dụng một 1=1trong những trường hợp không có tham số nào được truyền nhưng anh ta tránh chúng cho các tham số riêng lẻ không được thông qua, anh ta chỉ đơn giản là không '


Tôi chỉ đang xem bài viết thứ hai (vì hiện tại tôi không viết mã cho 2008 SP1), nhưng tôi thấy anh ấy đang sử dụng 1 = 1 trong mã của mình. Tôi đã quen thuộc với sp_executesql, nhưng điều đó không loại bỏ việc sử dụng 1 = 1, trong chính nó. Có lẽ tôi đang thiếu một cái gì đó?
bóng bán

2
+1 - Erland là nguồn tài nguyên cho loại điều này.
JNK

Chỉ cần trích dẫn từ liên kết thứ hai: "Trên các dòng 19-29, tôi soạn chuỗi SQL cơ bản. Điều kiện WHERE 1 = 1 trên dòng 29 là có cho phép người dùng gọi thủ tục mà không chỉ định bất kỳ tham số nào."
bóng bán

2
Lấy làm tiếc. Tôi gõ sai quan điểm của tôi. Sẽ chỉnh sửa. Tôi không có ý ám chỉ rằng có một vấn đề với cấu trúc Where 1 = 1, chỉ đề xuất các mẹo khác để dễ đọc và hy vọng tránh thực hiện cách tiếp cận WHERE (cột = value hoặc 1 = 1) và (cột1 = value1 hoặc 1 = 1), vv cách tiếp cận.
Mike Walsh

6

Với MySQL, bạn có thể kiểm tra, chạy EXPLAIN EXTENDED và sau đó HIỂN THỊ CẢNH BÁO để xem truy vấn thực tế. tl; dr: nó được tối ưu hóa đi.

mysql> use test
Database changed
mysql> create table test1(val int);
Query OK, 0 rows affected (0.19 sec)

mysql> explain extended select * from test1 where val > 11 and 1 = 1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                    |
+-------+------+--------------------------------------------------------------------------------------------+
| Note  | 1003 | select `test`.`test1`.`val` AS `val` from `test`.`test1` where (`test`.`test1`.`val` > 11) |
+-------+------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

1
Câu trả lời chính xác. Máy chủ Btw v5.7.18 cho biết 'EXTENDED' không được dùng nữa và sẽ bị xóa trong phiên bản tương lai. Từ tài liệu mysql: In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.Nó đã bị xóa trong MySQL v 8.0.
mikep
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.