Оптимизация запроса SQL INSERT - PullRequest
0 голосов
/ 19 февраля 2020

Недавно я искал возможные способы оптимизации моих запросов INSERT. Я обычно делаю INSERT с размером пакета 100.

Мой текущий пример запроса:

IF EXISTS (SELECT * FROM [db].[Prices] WHERE Source = 'Cars' AND TradeDate = convert(datetime,'18-02-20',5) AND Product = 'Audi' AND Price=NULLIF('5.00000',''))

BEGIN DELETE FROM [db].[Prices] WHERE Source = 'Cars' AND TradeDate = convert(datetime,'18-02-20',5) AND Product = 'Audi' AND Price=NULLIF('5.00000','') END;

INSERT INTO [db].[Prices] VALUES( 'Cars', convert(datetime,'18-02-20',5), 'APR25', NULL, 'Audi', NULLIF('5.00000',''), convert(datetime,'15-04-25',5), '1', GETUTCDATE(), convert(date,NULL,105), convert(date,NULL,105));

Возможные оптимизации, которые я нашел в результате исследований, следующие:

  • Заменить * полями
  • Заменить ГДЕ НА ВНУТРЕННЕЕ СОЕДИНЕНИЕ

Поскольку это довольно ново для меня, любые предложения приветствуются. Похоже, что наибольший потенциал заключается в изменении структуры ядра (ЕСЛИ СУЩЕСТВУЕТ - УДАЛИТЬ - ВСТАВИТЬ В).

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Рассмотрите возможность использования оператора MERGE. Вместо УДАЛИТЬ, а затем ВСТАВИТЬ, вы можете сделать ОБНОВЛЕНИЕ / ВСТАВИТЬ: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

0 голосов
/ 19 февраля 2020

EXISTS здесь не понадобится, вы можете использовать DELETE оператор:

 DELETE 
 FROM [db].[Prices] 
 WHERE Source = 'Cars' AND TradeDate = CONVERT(DATETIME,'18-02-20', 5) AND 
       Contract = 'APR25' AND ProductCode = 'Audi' AND 
       Price = NULLIF('5.00000','') -- this will always 5.00000 `NULLIF` will not required
       AND Strike = '27.7500';

Тогда вы можете использовать INSERT Заявление:

INSERT INTO [db].[Prices] (col1, col2, col3, . . .) -- Qualify all columns
    VALUES( 'Cars', convert(datetime,'18-02-20',5), 'APR25', NULL, 'Audi',
             NULLIF('5.00000',''), convert(datetime,'15-04-25',5), '1', 
             GETUTCDATE(), convert(date,NULL,105), 
             convert(date,NULL,105), 04, 2025, NULL, NULL, '27.7500', '20', 
             NULL, '0.5',NULL
          );

Вы можете удалить nullif() & стиль разговора в where предложение:

WHERE Source = 'Cars' AND TradeDate = '2020-02-18' AND 
      Contract = 'APR25' AND ProductCode = 'Audi' AND 
      Price = 5.00000 AND Strike = '27.7500';

Возможно, вам понадобится NULLIF() на Price:

NULLIF(Price, '')

Примечание: Всегда квалифицируйтесь все столбцы явно при использовании оператора INSERT INTO . ..

...