2016-04-12 2 views
-1

Мой простой запрос на обновление занимает слишком много времени. Есть около 10 м записей - из тех, что я выполняю только для записей 1к.Настройка производительности при обновлении запроса

себе, как это:

UPDATE tab 
    SET col1= 'yes', 
     col2 = 'yes' 
WHERE col7 ||'_'|| col8 = 'VAL_0' 
    AND col10 = 'NA' 

Это утверждение занимает около 70mins для выполнения.

Я также создал индекс на col7 ||'_'|| col8. Хотя это занимает такое количество времени.

EDIT: Вот VAL_0 'исходят из других результирующих (данных таблицы)

Есть ли какие-либо предложения, так что я могу сделать мой запрос быстрее бежать. Я пытался использовать индексы на (col10) и on (col7 ||'_'|| col8), но для выполнения требуется много времени. другие методы настройки, которые вы предлагаете?

Благодаря

+1

Double цитируемый '' NA "', является ли столбец? – jarlh

+2

Почему запятая после второго да? –

+4

Почему бы не просто 'col7 = 'VAL' и col8 = '0''? – jarlh

ответ

1

Это запрос:

UPDATE tab 
    SET col1= 'yes', 
     col2 = 'yes', 
WHERE col7 ||'_'|| col8 = 'VAL_0' AND col10 = 'NA' 

Начать с индексом на tab(col10). Это может помочь.

Если вы можете изменить запрос:

UPDATE tab 
    SET col1= 'yes', 
     col2 = 'yes', 
WHERE col7 = 'VAL' AND col8 = '0' AND col10 = 'NA'; 

(Примечание: Используйте 0 вместо '0' если col8 на самом деле число.)

Затем создать индекс на tab(col10, col7, col8)

+2

Можете ли вы описать, почему вы выбрали порядок столбца col10, col7, col8 при создании индекса? – jarlh

+0

@jarlh имеет значение, в каком порядке находятся столбцы индекса, на основе информации, предоставленной OP? Любая перестановка была бы прекрасной, imo. (Очевидно, что если есть другие запросы, использующие один или несколько из этих трех столбцов, то это может изменить ситуацию - возможно, но OP не упоминает ничего другого, кроме этого одного запроса, поэтому ...) – Boneist

+0

@jarlh. , , Для условий равенства это не имеет значения. Я просто выбирал индекс, который работал бы в обеих версиях запроса. –