我有一個問題,解決方法是交換首先過濾的內容,但我不確定這是否可能并且對它的作業原理不夠了解。
舉個例子:
這是一張桌子

當您使用 ff 查詢過濾它時:
select * from pcparts where Parts = 'Monitor' and id = 255322 and Brand = 'Asus'
按照邏輯,這將是正確的,因為 ID 中帶有字符的 Asus 組件將被過濾并防止 ORA-01722 錯誤。
但根據我的經驗,這是不一致的。
我嘗試在兩個不同的資料庫連接中使用相同的過濾,第一個沒有得到錯誤(如預期的那樣),但另一個得到了 ORA-01722 錯誤。
檢查解釋計劃,兩個資料庫的區別是ff:

我在想是否有可能確保在 ID 之前先過濾零件但我在搜索時找不到任何東西,這是否可能,如果沒有,不依賴于使用的解決此問題的方法是什么TO_CHAR
uj5u.com熱心網友回復:
我假設您想(在某種程度上)在不更改源代碼的情況下修復有缺陷的程式。
根據您的圖片,您正在使用“過濾謂詞”,這通常意味著 Oracle 沒有使用索引(盡管我不知道以這種方式顯示執行計劃的內容)。
如果你有一個索引PARTS,Oracle 可能會使用這個索引。
create index myindex on mytable (parts);
如果 Oracle 認為這個索引效率低下,它可能仍然使用全表掃描。您可能會試圖通過謊報不同值的數量(越不同的值,越有效)來“假”Oracle 認為這是一個有效的索引
exec dbms_stats.set_index_stats(ownname => 'myname', indname => 'myindex', numdist => 100000000)
注意:這將影響使用此表的其他查詢的性能
uj5u.com熱心網友回復:
“修復”相當簡單:控制你正在做的事情。
很明顯,ID列的資料型別是VARCHAR2. 因此,不要讓 Oracle猜測,指示它做什么。
No : select * from pcparts where Parts = 'Monitor' and id = 255322 and Brand = 'Asus'
Yes: select * from pcparts where Parts = 'Monitor' and id = '255322' and Brand = 'Asus'
--------
VARCHAR2 column's value enclosed into single quotes
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448737.html
