【问题标题】:Optimizing SQL INSERT query优化 SQL INSERT 查询
【发布时间】:2020-06-03 09:24:48
【问题描述】:

我最近一直在研究如何优化我的 INSERT 查询的可能方法。我通常做一个批量大小为 100 的 INSERT。

我当前的示例查询:

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));

我从研究中发现的可能优化如下:

  • 将 * 替换为字段
  • 将 WHERE 替换为 INNER JOIN

由于这对我来说相当新,因此欢迎提出任何建议。似乎最大的潜力在于改变核心结构(如果存在 - 删除 - 插入)。

感谢您的帮助。

【问题讨论】:

  • 2 位数年份?不不不不不! Y2k 之后的 20 年没有任何借口!

标签: sql sql-server performance tsql sql-insert


【解决方案1】:

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';

您可能需要在Price 上使用NULLIF()

NULLIF(Price, '')

注意:使用INSERT INTO . . 语句时,始终明确限定所有 列。

【讨论】:

    【解决方案2】:

    考虑使用 MERGE 语句。而不是 DELETE 后跟 INSERT,您可以执行 UPDATE / INSERT: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2014-02-04
      • 2014-11-16
      • 2011-06-22
      相关资源
      最近更新 更多