我有表結構:
journal_entries (id integer, account varchar(20), doc_date, date, amount numeric(15,4))
selected_accounts (account varchar(20), selection_id integer)
我可以在 doc_date 和 account 上查詢這個和 SQL 使用的索引:
select je.*
from journal_entries je
where je.doc_date>='01.01.2022' and
je.doc_date<='31.03.2022' and
(je.account like '23%' or
je.account like '24%')
但是當我用資料填充 selected_accounts 表時:
23%, 1
24%, 1
我正在嘗試在左連接中使用條件:
select
from selected_accounts sa
left join journal_entries je on (
je.doc_date>='01.01.2022' and
je.doc_date<='31.03.2022' and
je.account like sa.account)
然后 SQL 不使用 journal_entries.account 資料上的索引,它僅使用 je.doc_date 上的索引。
我可以給優化器或 SQL 引擎一些提示條件je.account like sa.account應該使用索引je.account嗎?
我正在使用 Firebird 3.1 和 Firebird 2.1,但我想,這個問題也存在于其他 SQL 資料庫上。
我傾向于接受我無法使用左連接中的條件進行最佳查詢的需要......
問題補充:我將第一個查詢中的計劃(例如由 IBExpert 給出)作為plan子句復制到第二個查詢,但 SQL 引擎報告:
index <index on journal_entries.account> cannot be used in the specified plan
所以,我的查詢中有一些東西阻止了journal_entries.account索引的參考和使用。
補充觀察:事實上 - 我的資料庫在 2022Q1(我的示例中指定的期間)有 1M 日志條目,然后第一個(好)查詢報告少于 1M 的索引記錄讀取,但第二個(壞)查詢報告 2*1M 索引記錄讀取(索引,因為索引 on journal_entries.doc_date),因此,這比完全讀取doc_date然后僅按selected_records條目過濾更糟糕。
向前邁了一步:感謝@Damien_The_Unbeliever 的評論,我做了這個測驗(原文如此!第一個以 % 為前綴的字串):
select je.*
from journal_entries je
where je.doc_date>='01.01.2022' and
je.doc_date<='31.03.2022' and
(je.account like '#%' or
je.account like '24%')
不再使用je.account索引,讀取次數增加。所以 - 在我看來,Firebird 查詢引擎/優化器掃描like條件中使用的字串文字并決定在je.account.
所以,也許我可以給 Firebird 一些通知(對于我的第二個/慢速查詢),我希望只有 post-%-fixed 字串為select_accounts.account output? 在 Firebird 引擎的情況下,這將解決我的問題。
uj5u.com熱心網友回復:
在這種情況下無法優化like,因為 Firebird 無法知道您的列有什么值。事實上somecolumn like '24%'可以使用索引是因為 Firebird 會將該運算式重寫somecolumn starting with '24'為(另請參閱LIKE,特別是標題為“About LIKEand the Optimizer”的注釋)。對于從列中獲得的引數或值,這是不可能的。
換句話說,您的問題的明顯解決方案是在您的連接條件中selected_accounts.account沒有填充'24%',而是使用'24', 和使用。STARTING WITH
在通配符并不總是出現的情況下,有時您需要完全匹配,您可以使用類似je.account starting with replace(sa.account, '%', '') and je.account like sa.account. 此解決方案假定%僅作為最后一個字符出現,并且沒有_使用通配符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476284.html
上一篇:物件中的物件元素
