性能:WHERE IN子句与(INSERT + INNER JOIN)

时间:2018-08-08 10:06:35

标签: sql database performance join where

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

此刻我有两种方法:

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

    • 选择COL1,COL2,COL3,COL4 来自MAIN_TABLE COL1 IN(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插入其中,并将此CACHE_TABLE与MAIN_TABLE联接以获得所需的结果:

    • 选择MT.COL1,MT.COL2,MT.COL3,MT.COL4 从MAIN_TABLE MT 加入CACHE_TABLE CT 开启CT.IDENTIFIER = MT.COL1 CT.CACHEID =

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

提前一吨!!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您需要测试这两种方法。

对于单个查询,我希望在大多数情况下in会赢得胜利-仅仅是因为创建表然后使用它需要多次往返数据库。

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

对这两个版本都有用的一件事是(col1)(col1, col2, col3, col4)上的索引。