考慮一下,我有一個名爲MYBOOKS的表由超過100萬行數據組成。 我想創建一個存儲過程來返回一本特定的書,如果:BOOKID提供,或者,如果BOOKID爲0,則返回所有行。Firebird有條件的WHERE子句
因此,這裏是我想出的SQL。
SELECT *
FROM MYBOOKS
WHERE :BOOKID = 0 OR BOOKID = :BOOKID
比方說,我想找到:BOOKID = 102 這工作,但它實際上返回,我正在尋找的數據只是前一行數百萬行的掃描通過。 有沒有辦法改進這個SQL?
請注意上圖已被簡化。 在實際情況下,我在WHERE子句中有更多的條件,我也想讓它們全部都是可選的。
SELECT *
FROM MYBOOKS
WHERE (:BOOKID = 0 OR BOOKID = :BOOKID) AND
(:AUTHORID = 0 OR AUTHORID = :AUTHORID) AND
(:TITLE = '' OR TITLE = :TITLE)
//..... and so on
是否有可能改進此SQL? 謝謝。
將索引添加到要搜索的字段。通常,爲每個柱子創建索引並不是最好的想法,因爲這會減慢表格中的每一項變化,但如果您不希望發生許多變化,則可以。 – pawel7318
已經爲搜索字段創建索引,但它們沒有幫助。看起來放慢速度的是「:BOOKID = 0」部分,它正在對每一行進行評估。 – Kagawa
確保您爲每個字段單獨創建它們,而不是一次創建它們。應該有一種方法來檢查你的查詢是否使用它們,但我不太記得FB。 – pawel7318