У меня есть проблема, когда исправление состоит в том, чтобы обменять то, что сначала фильтруется, но я не уверен, что это вообще возможно, и недостаточно знаю, как это работает.
Чтобы привести пример:
Вот таблица
Когда вы фильтруете это с помощью запроса ff:
select * from pcparts where Parts = 'Monitor' and id = 255322 and Brand = 'Asus'
по логике это будет правильно, так как компонент Asus с символом в его идентификаторе будет отфильтрован и предотвратит ошибку ORA-01722.
Но по моему опыту это непоследовательно.
Я попытался использовать одну и ту же фильтрацию в двух разных подключениях к БД, первое не получило ошибку (как и ожидалось), но другое получило ошибку ORA-01722.
Проверяя план объяснения, разница в двух БД - это ff:
Я думал, можно ли убедиться, что части были отфильтрованы сначала перед идентификатором, но я не могу ничего найти, когда я искал, возможно ли это, если нет, то как исправить эту проблему, не полагаясь на использование TO_CHAR
Почему вы хотите сравнивать то, что не является числом, с числом? Использовать текстовый литерал
«Исправить» довольно просто: взять под контроль то, что вы делаете.
Очевидно, что тип данных столбца 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
Я предполагаю, что вы хотите (вроде) исправить программу с ошибками, не меняя исходный код.
Согласно вашему изображению, вы используете «Предикаты фильтра», это обычно означает, что Oracle не использует индекс (хотя я не знаю, что таким образом отображает планы выполнения).
Если у вас есть индекс для PARTS
, Oracle, вероятно, будет использовать этот индекс.
create index myindex on mytable (parts);
Если Oracle сочтет этот индекс неэффективным, он все равно может использовать полное сканирование таблицы. Вы можете попытаться «подделать» Oracle, заставив его думать, что это эффективный индекс, солгав о количестве различных значений (чем больше различных значений, тем эффективнее)
exec dbms_stats.set_index_stats(ownname => 'myname', indname => 'myindex', numdist => 100000000)
Примечание. Это повлияет на производительность других запросов, использующих эту таблицу.
хорошо, это помогло мне, он заказал то, как он был отфильтрован, спасибо за это.
Если Id представляет собой строку символов, сравните ее со строкой
.. id = '255322'..