【问题标题】:Performance: WHERE IN clause vs (INSERT + INNER JOIN)性能:WHERE IN 子句 vs (INSERT + INNER JOIN)
【发布时间】:2019-01-15 13:24:56
【问题描述】:

我有一个需要执行大量 SELECT SQL 的用例

我目前有两种方法:

  1. 通过标识符列表进行查询。所以,我首先使用了 WHERE IN 子句:

    • 选择 COL1、COL2、COL3、COL4 从 MAIN_TABLE COL1 在哪里(1,2,3,8,11,78,59,65,74,25,36,54558,78854,558)
  2. 我可以创建一个表,比如说 CACHE_TABLE,然后首先将标识符(1,2,3,8,11,78,59,65,74,25,36,54558,78854,558)插入其中通过唯一键 CACHEID 和 JOIN 这个 CACHE_TABLE 和 MAIN_TABLE 来获得所需的结果:

    • 选择 MT.COL1、MT.COL2、MT.COL3、MT.COL4 来自 MAIN_TABLE MT JOIN CACHE_TABLE CT 在 CT.IDENTIFIER = MT.COL1 其中 CT.CACHEID =

在我的用例中,性能非常重要。所以我想知道方法#2是否会比方法#1产生更好的性能。 另外,如果有更好的替代方法

非常感谢!

【问题讨论】:

  • 您是否尝试过在显示执行计划的情况下运行这些查询?
  • 如果您有索引,则连接应该表现良好。基本上有 3 种类型的操作:where exists (...), where col in (...) 和 join。你应该测试哪个更好。低密度和高密度情况可能会有所不同。 (一些后端在内部将 (...) 转换为 OR 查询)

标签: sql database performance join where


【解决方案1】:

您的答案是最佳性能方法#2。 根据我的经验,IN 是一个非常慢的运算符,因为 SQL 通常将它评估为一系列由“OR”分隔的 WHERE 子句(WHERE x=Y OR x=Z OR...)。不过,与 ALL THINGS SQL 一样,您的里程可能会有所不同。速度很大程度上取决于索引

【讨论】:

  • 您好 Alireza,感谢您的意见!你能告诉我为什么方法#2会赢吗?谢谢
  • 。根据我的经验,IN 是一个非常慢的运算符,因为 SQL 通常将其评估为一系列由“OR”分隔的 WHERE 子句(WHERE x=Y OR x=Z OR...)。不过,与 ALL THINGS SQL 一样,您的里程可能会有所不同。速度很大程度上取决于索引
【解决方案2】:

您需要测试这两种方法。

对于单个查询,我预计 in 在大多数情况下会胜出——因为创建表然后使用它需要多次往返数据库。

此外,一些数据库会优化常量列表(例如,MySQL 对值进行二进制搜索而不是顺序搜索)。

对任何一个版本都有帮助的是(col1)(col1, col2, col3, col4) 上的索引。

【讨论】:

  • 您好@Gordon,感谢您的意见。只是评论或疑问,CACHE_Table 已经存在,我们将只执行插入和连接。此外,IN 查询很有可能在每个选择中都有更多的 70-100 个键。如果方法#1仍然更好,您能否提出建议?
  • @RajMansinka 。 . .我要重复一遍,你需要在你的数据库上进行测试。更重要的是主表上的索引。
猜你喜欢
  • 2010-11-04
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多