SQL-запрос оптимизировать для обновления - PullRequest
0 голосов
/ 31 октября 2019

Обновление этого запроса занимает много времени. Я хотел бы оптимизировать этот запрос, ваша помощь будет оценена.

DECLARE @text1 NVARCHAR(50) = N'test1'
DECLARE @text2 NVARCHAR(50) = N'test2'
DECLARE @text3 NVARCHAR(50) = N'test3'
DECLARE @text4 NVARCHAR(50) = N'test4'
DECLARE @text5 NVARCHAR(50) = N'test5'

UPDATE dbo.Session SET
text1 = CASE
WHEN text1 IS NOT NULL THEN @text1
ELSE text1 END  ,
text2 = CASE
WHEN text2 IS NOT NULL THEN @text2
ELSE text2 END,
text3 = CASE
WHEN text3 IS NOT NULL THEN @text3
ELSE text3 END,
text4 = CASE
WHEN text4 IS NOT NULL THEN @text4
ELSE text4 END,
text5 = CASE
WHEN text5 IS NOT NULL THEN @text5
ELSE text5 END

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Часто более оптимально (по времени) создавать новую таблицу, чем обновлять существующую.

create table dbo.Session_1 nologging as 
select /*Insert the other columns from the old table that you want to keep here*/
    decode(text1, null, null, 'test1') as text1,
    decode(text2, null, null, 'test1') as text2,
    decode(text3, null, null, 'test1') as text3,
    decode(text4, null, null, 'test1') as text4,
    decode(text5, null, null, 'test1') as text5
from dbo.Session;

Затем вы можете удалить старую таблицу и переименовать новую:

drop table dbo.Session;
alter table dbo.Session_1
rename to dbo.Session;
0 голосов
/ 31 октября 2019

Во-первых, я думаю, что ваша логика задом наперед. Обычно целью является присвоить значение, когда существующее значение равно NULL, а не заменить действительные значения. Однако это не ваш вопрос, поэтому я продолжу.

С простым запросом на обновление вы можете сделать две вещи:

  1. . строка обновляется только один раз, и попытки обновления для строк без обновлений не предпринимаются.
  2. Если обновляется значительная часть строк, замена данных часто более эффективна (insert быстрее, чем update для заданного числа строк).

Первый подход предполагает предложение WHERE:

UPDATE dbo.Session    
    SET text1 = (CASE WHEN text1 IS NOT NULL THEN @text1
    END),
        text2 = (CASE WHEN text2 IS NOT NULL THEN @text2
    END),
        text3 = (CASE WHEN text3 IS NOT NULL THEN @text3
    END),
        text4 = (CASE WHEN text4 IS NOT NULL THEN @text4
    END),
        text5 = (CASE WHEN text5 IS NOT NULL THEN @text5 END)
    WHERE text1 IS NOT NULL OR
          text2 IS NOT NULL OR
          text3 IS NOT NULL OR
          text4 IS NOT NULL OR
          text5 IS NOT NULL;
0 голосов
/ 31 октября 2019

Вы можете попробовать это:

DECLARE @text1 NVARCHAR(50) = N'test1', 
@text2 NVARCHAR(50) = N'test2',
@text3 NVARCHAR(50) = N'test3',
@text4 NVARCHAR(50) = N'test4',
@text5 NVARCHAR(50) = N'test5'


UPDATE dbo.Session
SET text1 = ISNULL(text1,@text1)  ,
text2 = ISNULL(text2,@text2),
text3 = ISNULL(text3,@text3),
text4 = ISNULL(text4,@text4),
text5 = ISNULL(text5,@text5)
...