2015-04-27 2 views
0

Я обновляю таблицу на SQL Server с примерно 100 различными условиями. Ниже приведен список примеров обновления SQL, который я делаю.Обновление таблицы на SQL Server с помощью пользователя

Проблема в том, что таблица mytable.table1 немного большая (имеет 2 миллиона строк). Эти 100 запросов обновления вместе занимают более 10 минут.

Есть ли способ создать определенную пользователем функцию для обновления таблицы с меньшим количеством запросов. У меня нет указателя в таблице. Каждый запрос на обновление должен пройти всю таблицу.

Я немного прочитал о пользовательских функциях в SQL Server, не нашел слишком много о моей ситуации.

-------------------- ОБНОВЛЕНИЕ 1 ------------------------ -------

мои запросы обновления не только обновляют столбец до одного значения.


update p 
set p.column1 = 'abc' 
from mytable.table1 p 
where p.column2 = 'a' and p.column3 = 'b' 

update p 
set p.column1 = 'edf' 
from mytable.table1 p 
where p.column2 = 'c' or p.column4 = 'd' 

update p 
set p.column1 = 'wxf' 
from mytable.table1 p 
where p.column3 = 'd' and p.column5 = 'f' 

update p 
set p.column1 = 'xyz' 
from mytable.table1 p 
join mytable.table2 c on p.column1 = c.column1 
where p.column2 = 'w' and p.column3 = 'a' 

update p 
set p.column1 = 'ere' 
from mytable.table1 p 
join mytable.table2 c on p.column1 = c.column1 
join mytable.table3 r on p.column2 = r.column2 
where p.column2 = 'w' and p.column3 = 'b' or p.column4 = 'a' 

ответ

2

Попробуйте что-то вроде этого:

UPDATE 
    p 
SET 
    p.column1 = 'abc' 
FROM 
    mytable.table1 p 
    LEFT JOIN mytable.table2 c ON p.column1 = c.column1 
    LEFT JOIN mytable.table3 r ON p.column2 = r.column2 
WHERE 
    ((p.column2 = 'a' 
     AND p.column3 = 'b' 
    ) 
     OR (p.column2 = 'c' 
      OR p.column4 = 'd' 
     ) 
     OR (p.column3 = 'd' 
      AND p.column5 = 'f' 
     ) 
     OR (c.column1 IS NOT NULL 
      AND p.column2 = 'w' 
      AND p.column3 = 'a' 
     ) 
     OR (c.column1 IS NOT NULL 
      AND r.column2 IS NOT NULL 
      AND (p.column2 = 'w' 
       AND p.column3 = 'b' 
       OR p.column4 = 'a' 
       ) 
     ) 
    ); 
+0

Спасибо за ваш ответ. Я недостаточно четко сформулировал свою точку зрения. Это не только устанавливает столбец 1 в «abc», есть случаи, чтобы установить p.column1 = 'def'. – Payson

+0

В этом случае вы можете сделать что-то вроде: SET p.column1 = CASE WHEN p.column2 = 'a' И p.column3 = 'b' THEN 'abc' КОГДА p.column2 = 'c' И p.column4 = 'd' THEN 'def' ... END –

1

Если вы описываете реальную ситуацию, и это не другой колледж ориентированный ограничен вызов, то:

  1. Вы есть, чтобы использовать индексы для повышения производительности.

  2. функции в MS SQL позволяет сэкономить время на разработку и/или может сделать код более понятным, но они не являются индекс (ы) «убийца»;)

  3. Если ваш пример является реалистичным конечно, вы можете использовать один оператор обновления, как указано выше. Но помните, что с индексами ваше заявление будет завершено за несколько секунд ...

Предлагаю вам использовать приведенные выше инструкции, а также индексы.

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