Как определить, какое предложение where будет отфильтровано первым в Oracle и как его контролировать?

У меня есть проблема, когда исправление состоит в том, чтобы обменять то, что сначала фильтруется, но я не уверен, что это вообще возможно, и недостаточно знаю, как это работает.

Чтобы привести пример:

Вот таблица

Как определить, какое предложение where будет отфильтровано первым в Oracle и как его контролировать?

Когда вы фильтруете это с помощью запроса ff:

select * from pcparts where Parts = 'Monitor' and id = 255322 and Brand = 'Asus'

по логике это будет правильно, так как компонент Asus с символом в его идентификаторе будет отфильтрован и предотвратит ошибку ORA-01722.

Но по моему опыту это непоследовательно.

Я попытался использовать одну и ту же фильтрацию в двух разных подключениях к БД, первое не получило ошибку (как и ожидалось), но другое получило ошибку ORA-01722.

Проверяя план объяснения, разница в двух БД - это ff:

Как определить, какое предложение where будет отфильтровано первым в Oracle и как его контролировать?

Я думал, можно ли убедиться, что части были отфильтрованы сначала перед идентификатором, но я не могу ничего найти, когда я искал, возможно ли это, если нет, то как исправить эту проблему, не полагаясь на использование TO_CHAR

Если Id представляет собой строку символов, сравните ее со строкой .. id = '255322'..

Serg 23.03.2022 08:47

Почему вы хотите сравнивать то, что не является числом, с числом? Использовать текстовый литерал

astentx 23.03.2022 09:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Исправить» довольно просто: взять под контроль то, что вы делаете.

Очевидно, что тип данных столбца IDVARCHAR2. Поэтому не делайте 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)

Примечание. Это повлияет на производительность других запросов, использующих эту таблицу.

хорошо, это помогло мне, он заказал то, как он был отфильтрован, спасибо за это.

gabo 23.03.2022 14:41

Другие вопросы по теме