首頁 >資料庫 >mysql教程 >EXISTS 子查詢中的 SELECT 1 與 SELECT *:對效能重要嗎?

EXISTS 子查詢中的 SELECT 1 與 SELECT *:對效能重要嗎?

Barbara Streisand
Barbara Streisand原創
2025-01-15 20:14:42884瀏覽

SELECT 1 vs. SELECT * in EXISTS Subqueries: Does it Matter for Performance?

*EXISTS 子查詢最佳化:SELECT 1 與 SELECT 的效能差異**

在 SQL 查詢中使用 EXISTS 運算子時,關於子查詢中是否指定 SELECT 1 或 SELECT * 存在爭議。本文探討這兩種方法的效能影響。

**傳統方法:SELECT ***

傳統上,子查詢使用 SELECT *,因為它會檢索子查詢中的所有欄位。

<code class="language-sql">IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END</code>

替代方法:SELECT 1

資料庫專家建議,對於 EXISTS 檢查,使用 SELECT 1 更有效,因為它只會傳回單一值。

<code class="language-sql">IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END</code>

效能差異

儘管 SELECT 1 據稱具有潛在的效能優勢,但 Microsoft SQL Server 旨在優化 EXISTS 運算子的子查詢。無論使用 SELECT 1 或 SELECT *,SQL Server 都不會向系統傳回資料。

驗證

為了驗證此最佳化,請嘗試執行以下查詢:

<code class="language-sql">SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )</code>

即使子查詢執行無效的除法,也不會拋出錯誤。這表示 EXISTS 子查詢中的 SELECT 清單不會被評估。

SQL 標準

ANSI SQL 1992 標準明確指出,當 SELECT 清單在 EXISTS 子查詢中僅包含 "*" 時,它等效於任意文字。

結論

基於 SQL Server 的最佳化能力和 SQL 標準,在 EXISTS 子查詢中使用 SELECT 1 或 SELECT * 沒有效能差異。兩種方法都將以相同的效率傳回相同的結果。

以上是EXISTS 子查詢中的 SELECT 1 與 SELECT *:對效能重要嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn