Оптимизация порядка вычисления предложения WHERE в DB2 - PullRequest
2 голосов
/ 27 июля 2011

Я работаю с двумя очень большими таблицами (A - ~ 20E6 строк, B - ~ 65E3 строк), и у меня есть очень подробные предложения где получить только те элементы, которые мне нужны.Одна вещь, которая может ускорить его, - это сначала оценить дату создания записи (информация возвращается более 10 лет, нужно только последние 3 года);это исключит большую часть данных перед выполнением дорогостоящей обработки строк.Есть ли способ заставить WHERE date > cutoff_date выполнить оценку перед другими предложениями?

Вот как выглядит мой запрос.

SELECT A.C1, A.C2, 
SUM(CASE WHEN B.C1 = '[condition 1]' OR ...  [condition n] THEN 1 ELSE NULL END) 
    AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN DB.TABLE_B AS B ON B.COMMON_COL = A.COMMON_COL
WHERE B.DATE > DATE('[cutoff date]')
    AND [complex substr conditions]
    AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2

Одна проблема в том, что я толькоесть разрешение на чтение для БД.Просматривая Центр управления, кажется, что ни в одной из таблиц A или B нет индекса, поэтому маршрут оптимизации отсутствует.

Любая помощь, которую вы могли бы оказать, была бы полезной;мои небольшие тестовые запросы занимают около 5 минут, а в запросах продукта они будут примерно в 20 раз больше.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Попытки превзойти современные оптимизаторы запросов обычно не очень продуктивны. Я думаю, тебе стоит потратить время на две другие вещи.

  1. Узнайте, какой бизнес-процесс позволяет получать индексы, созданные на столбцы, которые должны иметь индексы.
  2. Узнайте, как запустить и интерпретировать вывод EXPLAIN PLAN. это позволяет приблизиться к управлению с номерами, которые показывают, что ваш код медленно, не потому что ты некомпетентен, а потому что они DB2 вынуждена везде выполнять сканирование таблиц.

Таблицы, которые вообще не имеют индексов *1013*, часто создаются программами либо для упрощения запросов и отчетов, либо для снижения нагрузки на главный сервер базы данных. Узнайте, кто отвечает за эти программы. Подружитесь с ними. Купи им пиццу. Подумайте, «социальная инженерия».

0 голосов
/ 28 июля 2011

Вы можете использовать предложение WITH в своем операторе SELECT :

WITH
B2(col1, col2, ... ) AS (
    SELECT col1, col2, ...
    FROM DB.TABLE_B AS B
    WHERE B.DATE > DATE('[cutoff date]')
)
SELECT A.C1, A.C2, 
SUM(CASE WHEN B2.C1 = '[condition 1]' OR ...  [condition n] THEN 1 ELSE NULL END) 
    AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN B2 ON B2.COMMON_COL = A.COMMON_COL
WHERE 
    AND [complex substr conditions]
    AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2
...