Запрос Oracle при полном сканировании таблицы

#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 , там должно быть предложение where where id is null . К сожалению, в этом where предложении также не будет использоваться customer_table_TN index . Смотрите use-the-index-luke.com/sql/where-clause/null/index как это можно решить.