Я после некоторых совет пожалуйста.Оператор PostgreSQL CASE требует индексов?
Я написал инструкцию CASE для заполнения нового поля. Для таблицы базы данных, содержащей более 300 миллионов записей, это заняло около 12 часов.
UPDATE line
SET code = (CASE
WHEN (group ='{Building}' and term = '{Outline}') then 1
WHEN (group ='{Building}' and term = '{Division}') then 2
WHEN (group ='{Building}' and term = '{Partial}') then 3
ELSE 99
END)
WHERE code is null;
Что я могу сделать, чтобы увеличить производительность?
Должен ли я добавить индекс в столбец кода перед запуском оператора case, чтобы он быстрее мог найти записи, которые имеют значение кода NULL.
Или я должен создавать индексы для групп столбцов и «термин», чтобы ускорить его.
С таблицей этого большого времени потребуется некоторое время, чтобы создать любые индексы, чтобы сбалансировать время, затрачиваемое на их создание, и полученное в результате увеличение производительности.
Спасибо за любые советы
EDIT Дополнительной информацией
Am с использованием PostgreSQL 9.2 64Bit на Windows 2008 Server Я использовал вика PostgreSQL Tuning и оптимизировал файл postgresql.conf я сделал ВАКУУМЫ И АНАЛИЗЫ на столе
http://wiki.postgresql.org/wiki/SlowQueryQuestions Но индекс на 'code' поможет.Если имеется относительно немного строк, где код является нулевым, то, возможно, даже неполный индекс с условием 'where code is null ' –
Вы можете использовать отдельные запросы: UPDATE line SET code = 1 где group =' {Building} 'и term = '{Outline}', а код - null; UPDATE line SET code = 2 где group = '{Building}' и term = '{Division}', а код - null; UPDATE line SET code = 3 где group = '{Building}' и term = '{Partial}', а код - null; UPDATE line SET code = 99, где код равен NULL; Можете ли вы предоставить результаты EXPLAIN для каждого запроса? –
@VitaliyPro «Обновление по строке (стоимость = 0,00..48847898,66 строк = 41740 ширина = 996)» »-> Seq Сканирование в строке (стоимость = 0,00..48847898,66 строк = 41740 ширина = 996)« »Фильтр: ((код IS NULL) AND (group = '{Building}' :: character variableing []) AND (term = '{Outline}' :: character variableing []))) " – tjmgis