ОБНОВЛЕНИЕ SQL работает плохо - PullRequest
2 голосов
/ 24 июня 2011

Моя таблица базы данных имеет следующие столбцы: А1, А2, А3, А4, А5, А6

Мне нужно обновить эти записи и сдвигать значения влево, когда я сталкиваюсь с нулевым столбцом. Цель состоит в том, чтобы не иметь нулевых значений между столбцами, значения которых начинаются слева. Например, если:

A1 = NULL , A2 = 1 , A3 = 4, A4 = 5, A5 = 9, A6 = 8

Я должен сдвинуть значения влево, чтобы результат был:

A1 = 1, A2 = 4 , A3 = 5, A4 = 9, A5 = 8, A6 = NULL

Пока что я предложил следующий запрос, но он медленный. Дайте мне знать, если вы можете настроить запрос, чтобы сделать его быстрее. Еще одна вещь, что если я сделаю это в c #? Будет ли быстрее, если я переберу там Datarows и обновлю каждую строку?

UPDATE myTable SET
    A5 = A6,
    A6 = NULL
WHERE (A5 IS NULL) AND (NOT A6 IS NULL)

UPDATE myTable SET
    A4 = A5,
    A5 = A6
WHERE (A4 IS NULL) AND (NOT A5 IS NULL)

UPDATE myTable SET
    A3 = A4,
    A4 = A5,
    A5 = A6
WHERE (A3 IS NULL) AND (NOT A4 IS NULL)

UPDATE myTable SET
    A2 = A3,
    A3 = A4,
    A4 = A5,
    A5 = A6
WHERE (A2 IS NULL) AND (NOT A3 IS NULL)

UPDATE myTable SET
    A1 = A2,
    A2 = A3,
    A3 = A4,
    A4 = A5,
    A5 = A6
WHERE (A1 IS NULL) AND (NOT A2 IS NULL)

Ответы [ 4 ]

2 голосов
/ 24 июня 2011

Как насчет использования coalesce в выражении вроде этого:

update mytable
set a1 = coalesce(a1,a2,a3,a4,a5,a6),
    a2=coalesce(a2,a3,a4,a5,a6), 
    a3=coalesce(a3,a4,a5,a6), 
    a4=coalesce(a4,a5,a6), 
    a5=coalesce(a5,a6)
2 голосов
/ 24 июня 2011

Учитывая, что [anything] + NULL + [anything] равно нулю, как насчет;

declare @t table(A1 int, A2 int, A3 int, A4 int, A5 int, A6 int)
insert @t values 
   (NULL, 2 , 3, 4, 5, 6),
   (1, NULL, 3, 4, 5, 6),
   (1, 2, NULL, 4, 5, 6),
   (1, 2, 3, NULL, 5, 6),
   (1, 2, 3, 4, NULL, 6),
   (1, 2, 3, 4, 5, NULL),
   (1, 2, 3, 4, 5, 6)

update @t
  set A1 = coalesce(A1, A2),
  A2 = case when A1 + A2                is null then A3 else A2 end,
  A3 = case when A1 + A2 + A3           is null then A4 else A3 end,
  A4 = case when A1 + A2 + A3 + A4      is null then A5 else A4 end,
  A5 = case when A1 + A2 + A3 + A4 + A5 is null then A6 else A5 end,
  A6 = case when A1 + A2 + A3 + A4 + A5 is null then null else A6 end
from @t

select * from @t


A1  A2  A3  A4  A5  A6
2   3   4   5   6   NULL
1   3   4   5   6   NULL
1   2   4   5   6   NULL
1   2   3   5   6   NULL
1   2   3   4   6   NULL
1   2   3   4   5   NULL
1   2   3   4   5   6
0 голосов
/ 24 июня 2011

Если нет, вы пытались добавить индексы покрытия для всех ваших столбцов?Попробуйте добавить индексы следующим образом.Это делается для того, чтобы он мог находить строки, которые необходимо обновить быстрее, индекс покрытия так, что ему не нужно выполнять поиск по закладкам, чтобы получить следующее нужное ему значение.

A1, A2, A3, A4, A5, A6
A2, A3, A4, A5, A6
A3, A4, A5, A6
A4, A5, A6
A5, A6
0 голосов
/ 24 июня 2011

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

Настройте триггер INSERT, UPDATE, который будет специально просматривать только те строки, которые только что были изменены. Таким образом, вы не запускаете оператор обновления для данных, которые уже были проверены на согласованность. Меньше строк для проверки / обновления означает лучшую производительность.

Вы можете сузить его до строк, которые были затронуты, посмотрев на виртуальные таблицы inserted и deleted.

Как только ваш триггер будет на месте, либо дотроньтесь до всех существующих строк (чтобы запустить триггер на них), либо запустите ваш оригинальный скрипт, чтобы убедиться, что все находится в согласованном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...