Best-Practices

在應該只返回一行的查詢上使用“LIMIT 1”是一種不好的形式嗎?

  • April 16, 2017

如果您有這樣的查詢:

SELECT * FROM table WHERE primary_key_column = 123 LIMIT 1;

你怎麼看LIMIT 1?從技術上講,這不是必需的,因為我們在一個獨特的列上進行選擇。但我一直有將 放在LIMIT 1末尾的習慣,因為它明確顯示了您的期望。

我認為主要的負面因素可能是它可能會掩蓋查詢中的錯誤邏輯,使其返回不止一行,並使直接錯誤更難解決。

那麼UPDATEorDELETE呢?這種“腰帶和大括號”的方法:

UPDATE table SET a = 'ABC' WHERE primary_key_column = 123 LIMIT 1;

我們都知道在LIMIT 1終端中輸入查詢以防止更新我們不打算更新的行時,這是很有意義的。但是你仍然提倡在應用程序中對硬編碼和測試查詢使用它嗎?

問題本質上是一般性的,沒有考慮到特定的 DBMS。

對於SELECT,我認為主要考慮因素之一與性能有關。

當使用LIMIT 1關於行相關性的統計資訊時,可能會在確定更慢/更快的查詢執行方面發揮作用。雖然這對於小型數據集可能無法立即觀察到,但隨著行數和索引大小的增長(取決於 DB),它可能會成為一個問題。

這個例子為例,由於數據庫對執行成本的不同假設(基於pg_statistic目錄中可用的統計數據,特別是correlation值),Postgres 使用者遇到了不同的執行時間,因此導致了不同的索引掃描策略。

根據經驗,我LIMIT只會在必要時使用該子句,而不是將我的期望外化。

UPDATE正如已經提到的,DELETE行為高度依賴於數據庫。

引用自:https://dba.stackexchange.com/questions/168663