*EXISTS 子句效能:SELECT 1 與 SELECT 的比較**
在 SQL 中,EXISTS 子句用於檢查子查詢中是否存在符合指定條件的行。長期以來,開發人員在 EXISTS 查詢中同時使用 SELECT 1 和 SELECT *,這引發了一個問題:哪種方法更有效率?
SQL Server 最佳化
根據微軟的說法,SQL Server 夠智能,能夠辨識 EXISTS 的使用,而不管子查詢的 SELECT 清單是什麼。它不會向系統傳回任何數據,因此 SELECT * 和 SELECT 1 子句在效能方面是等效的。
根據微軟的文件:
"由EXISTS 引入的子查詢的select 清單幾乎總是包含星號()。沒有理由列出列名,因為您只是在測試是否存在滿足子查詢中指定條件的行。
自我驗證
為了證實這種行為,您可以執行以下查詢:
<code class="language-sql">SELECT whatever FROM yourtable WHERE EXISTS(SELECT 1/0 FROM someothertable WHERE a_valid_clause)</code>如果 SELECT 清單確實參與其中,則此查詢將觸發除零錯誤。但是,由於 SQL Server 理解 EXISTS 子句的上下文,因此它不會對 SELECT 清單執行任何計算。
SQL 標準
ANSI SQL 1992 標準進一步闡明了這種行為,指出在 EXISTS 謂詞的上下文中,select 列表 "*" 等效於任意字面值。
結論
在 SQL Server 中,在 EXISTS 子句中選擇 SELECT 1 和 SELECT * 不會影響效能。這兩種方法都會產生相同的結果,因為優化器會識別它們的用途並且不會向系統傳回任何資料。以上是EXISTS 子句最佳化:SELECT 1 與 SELECT * — 這很重要嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!