簡體   English   中英

數據庫查詢優化問題

[英]Database query optimization question

問題假設:

  1. 數據庫不可知
  2. 由於X和Y的值,兩個查詢都將僅返回一行

題:

哪種查詢更快,是更好的做法?:

SELECT * FROM my_table WHERE X = 'some value' AND Y = 'other value';

要么

SELECT * FROM my_table WHERE X = 'some value';

基本上,將多余的參數傳遞到查詢中是使您受益還是失去(在性能方面),如果答案是“好處”,那么這是“好”做法嗎?

顯然,帶有更多參數的查詢需要做更多的工作,但是我想您會發現,在大多數情況下,差異將是微不足道的,以至於無法解決。

最佳實踐是以解決您的業務問題並使芯片落在可能的位置的方式編寫查詢。 如果您顯然知道某個參數是多余的,則除簡化代碼外,別無其他選擇。 但是,我不會花費大量時間來查找由於數據的當前狀態而導致參數冗余的情況。

關於性能,如果表已正確索引,應該不會有太大的區別。

  • 如果X列具有索引,則兩個查詢都將很快。
  • 如果X列和Y列均未索引,則兩個查詢的速度不會那么快,而是速度類似(假設對於大多數行,兩個條件都失敗-那么將僅對其中一個求值)。
  • 如果對Y列進行索引而不對X進行索引,則第二個查詢將更快,因為它是唯一可以在Y列上使用索引的查詢。

要注意的一件事是,如果X和Y的值不是您期望的,則兩個查詢可能會給出不同的結果。 在第一種情況下,即使Y的值與預期的不同,它也會返回該行。 在第二種情況下,該行將根本不會返回。 您應該考慮在這種錯誤情況下要發生的情況,然后根據該決定選擇查詢。 如果要Expected value 'foo' for Y but found 'bar'顯示錯誤的Expected value 'foo' for Y but found 'bar'則需要獲取該行,以便第一個查詢更合適。

與其他答案一樣,並假設索引位置正確,更好的做法是非常具體地陳述您想要的內容。 您現在可以依靠結果的數量,但是要在一個不斷發展的項目中進行前瞻性思考,並確保隨着更改的進行,查詢將盡可能保持精確。

如果您在(X,Y)上有一個索引,則如果兩個查詢確實返回相同數量的行,則速度應該沒有差異(如果第二個查詢返回更多行,那當然會慢一些)

如果您的索引是相反的,即定義為(Y,X),則第二個查詢可能會慢得多,因為該索引對於大多數DBMS不可用。

我認為Oracle 11g甚至可以對第二個查詢使用(Y,X)索引,但是作為索引的前綴匹配它仍然會比較慢。

從邏輯上講,如果一參數查詢和二參數查詢都獲取一行,並且X是它們的常見條件,則AND Y =“其他值”在查詢優化器中不應成為重要的列。

除非您需要並且僅需要Y作為一行的查詢條件,否則在此示例中,在Y上進行索引不是一個好習慣。

在此示例中,X上的索引是重點,因為單參數查詢應返回“一行”。

我認為數據庫性能問題與您需要什么以及如何在較低的I / O(邏輯I / O,具有隱式物理I / O)中獲取所需的行有關。

但是,最佳實踐是,我也同意解決您的業務問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM