#sql #oracle #sql-execution-plan
#sql #Oracle #sql-план выполнения
Вопрос:
Я не понимаю, почему эта таблица (разделенная по диапазону) находится при полном сканировании таблицы в этом запросе:
UPDATE customer_table
SET username = '',
phone = '',
ip = '',
cell = '',
channel = ''
WHERE id = '';
Я также создал этот индекс:
CREATE INDEX customer_table_UPD_EXT_SYS ON customer_table
(USERNAME, CLI, IP, MSISDN, CANALE, TN)
Кто-нибудь может мне помочь?
Комментарии:
1. Вам нужна дополнительная информация. Если, например,
customer_table
очень мало, то полное сканирование таблицы является наиболее эффективным способом реализации запроса. Кроме того, еслиid
это строка, тоid = ''
никогда не будет вычисляться как true в Oracle, потому что пустая строка обрабатывается какNULL
(по умолчанию).2. Привет, эта таблица будет содержать около 1 миллиона записей в каждом разделе, поэтому следует избегать полного сканирования таблицы. В запрос я вставил значения «, но в реальном запросе они будут оценены
Ответ №1:
Чтобы избежать полного сканирования таблицы, индекс должен (по крайней мере частично) соответствовать WHERE
предложению. В вашем примере помог бы индекс на customer_table.id
. Ваш индекс customer_table_UPD_EXT_SYS
содержит обновленные столбцы; что касается вашего UPDATE
заявления, это на самом деле плохая новость, поскольку индекс также нуждается в обновлении, что может быть дороже, чем обновление таблицы.
Комментарии:
1. У меня также есть индекс по идентификатору: СОЗДАЙТЕ ИНДЕКС customer_table_TN ДЛЯ customer_table (ID) Итак, вы предлагаете мне удалить индекс в инструкции update (не условие where)?
2. Если он вам не нужен для других запросов, удалите его. Тем не менее,
where id = ''
это совершенно бессмысленноеwhere
предложение в Oracle, поскольку в Oracle пустая строка равна null. Чтобы выбрать строки с пустымid
, там должно быть предложение wherewhere id is null
. К сожалению, в этомwhere
предложении также не будет использоватьсяcustomer_table_TN index
. Смотрите use-the-index-luke.com/sql/where-clause/null/index как это можно решить.