【问题标题】:What is the performance of INSERT with JOIN versus using INSERT with CASE?与使用 INSERT 和 CASE 相比,INSERT with JOIN 的性能如何?
【发布时间】:2013-09-18 16:43:06
【问题描述】:

当然,对于大多数小型事务来说,这不是一个很大的因素,但是对于较大的数据集,假设有有用的索引,使用 JOIN 而不是使用 CASE 执行 INSERT 是否更快?

使用 CASE 的示例(在 T-SQL 中):

INSERT into Foo
(CarID, CarMake)
(SELECT CarID,
   CASE WHEN CarModel = 'Odyssey' THEN 'Honda'
        WHEN CarModel = 'Sienna' THEN 'Toyota' END
        as CarMake
    FROM FooCar)

使用 JOIN 的示例:

INSERT into Foo
(CarID, CarMakeID)
(SELECT A.CarID, B.CarMake
 FROM FooCar as A
 JOIN FooMake as B on (A.CarModel = B.CarModel)
 )

这两个语句中的哪一个会达到更快的目标?请查看示例数据样本,它不能很好地代表问题的大小。 我找不到像这样的另一个问题,但似乎应该已经提出并回答了。

【问题讨论】:

    标签: sql performance join case


    【解决方案1】:

    case 语句通常会更快。 join 在大多数其他方面都更好。拥有引用表的目的是避免在代码中硬编码特定值。最好使用参考表。

    性能差异通常非常小,特别是如果FooMake 设计良好并且在CarModel 上有一个索引。您不应该在查询中寻找这种微优化。首先努力使查询正常工作,使用合理的 SQL,然后再提高性能。

    只有当所有品牌都出现在FooMake 中并且只出现一次时,这两个版本才等效。

    【讨论】:

    • 我的示例没有说明这一点,但我的意图是 FooMake 已标准化,每次制作只有一条记录。谢谢你的回答。
    【解决方案2】:

    硬编码的查询值(如 CASE 语句中的那些字符串文字)将被翻译成内存中的机器语言命令,并且总是比执行连接所需的磁盘 I/O 更快。

    使用表而不是 CASE 语句的原因是可维护性而不是速度。如果 CASE 语句作用于两个字段而不是一个字段怎么办?或者添加一些分支逻辑?对速度查询进行硬编码就像在雪地摩托上穿越冰冻的苔原,雪地摩托会翻过来,把你困在下面。晚上,冰鼬来了。

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2019-01-15
      相关资源
      最近更新 更多