2014-12-24 3 views
0

Мне нужно удалить данные из table1 для идентификаторов, присутствующих в table2. Я выполнил следующее заявление, но это будет для просмотра таблицы, даже если индексы присутствуют:Оператор удаления DB2

DELETE FROM table1 t1 WHERE t1.ID IN (SELECT T.ID FROM table2 T) ; 

Есть ли какой-то другой способ объединения таблиц в DB2 для удаления заявления, так что я могу избежать сканирования таблицы.

+0

Сканирование таблицы, за которой стоит таблица?Это почти наверняка сканирует 'table2' (учитывая, что вы запрашиваете все строки из этой таблицы). Это особенно верно, если 'table2.ID' является первичным ключом для этой таблицы, который будет« в порядке »в основном наборе записей (... вроде, это сложно). Некоторые версии (например, LUW) позволяют вам указывать дополнительные таблицы в 'JOIN's, но вы все равно можете получить полное сканирование, если хотите, чтобы все данные из данной таблицы. –

ответ

3

Сканирование таблицы, само по себе, не обязательно является плохим.

CAVEAT: Без объяснения плана или DDL для table1, вы не можете получить полный ответ на данном конкретном случае.

При этом оптимизатор DB2 определит наиболее эффективный план выполнения запроса. В зависимости от того, сколько данных вы удаляете с table1, может быть более эффективным сканирование таблицы, чем было бы проходить через индекс для каждого идентификатора, который нужно удалить, а затем извлечь строки.

Некоторые из факторов, влияющих на решение оптимизатора для этого являются:

  1. Таблица и индекс статистики

  2. Количество строк, которые будут удалены (и по отношению к общему количеству строк в table1)

  3. отношение кластера (или фактор кластера) из потенциально полезного индекса (ов)

  4. Число уровней в упомянутом выше индекса (ов)

  5. размер BUFFERPOOL (ы)

Здесь чрезвычайно упрощенный пример, иллюстрирующий точку, что сканирование таблицы не обязательно плохо:

Предположим, что t1 имеет 500 страниц, а индекс i1, который, по вашему мнению, должен использоваться, имеет 3 уровня и очень низкий коэффициент кластера. Далее предположим, что вы собираетесь удалить из таблицы 200 строк.

Чтобы выполнить удаление с помощью простого сканирования таблицы, DB2 проверит 500 страниц данных для таблицы.

Для удаления по индексу для каждой строки, которая будет удалена, будут прочитаны 3 страницы индекса (корневая, промежуточная и листовая страница), а также страница данных, содержащая строку. (4 строки данных, считанные для каждой строки, подлежащей удалению). Таким образом, при удалении 200 строк использование индекса будет означать, что DB2 читает 800 страниц (на 60% больше, чем сканирование таблицы) - поэтому оптимизатор выбирает сканирование таблицы.

Очевидно, что это намного сложнее, чем это - размер индекса, будь то полное сканирование индекса или (как описано), шаг за шагом по индексу для каждой строки, размеры пула буферов, коэффициенты кластера и многое другое решение оптимизатора. Но есть много случаев, когда сканирование таблицы действительно является наиболее эффективным методом для данного запроса.

Смежные вопросы