0

我正在查询一列,例如

select * 
  from X1, X2, X3
 where X1.a = X2.a 
   and X2.b = X3.b 
   and X3.c IN ('c1a','c1b','c1c') 

可能会有大约 10 个这样的 c1% 值

另一个查询是:

select * 
  from X1, X2, X3
 where X1.a = X2.a 
   and X2.b = X3.b 
   and X3.c like 'c1%'

此处的表 X3 已编入索引c

我理解这两个查询的含义是不同的,但在我的用例中它们将返回相同的结果。我想知道哪个查询会更快(并且它是否重要,例如在一种情况下可能不使用索引)?

4

1 回答 1

4

“哪个查询会更快”

...不是我们可以回答的问题。因为你没有提供任何有用的信息。查询性能很大程度上取决于两个因素:数量和偏差。

体积的意思:

  • X1 有多少行?
  • X2 有多少行?
  • X3 有多少行?

歪斜的意思:

  • X1 中有多少行匹配 X2 中的行?
  • X2 中有多少行匹配 X3 中的行?
  • X3 中有多少行在 C 中有与“c1%”匹配的值?

这就是为什么收集统计数据很重要,这样数据库才能了解数据分布并制定适当的执行计划。

例如,如果 X1 是一个小表并且几乎不匹配 X2 中的任何行,并且 X2 几乎不匹配 X3 中的任何行,那么访问路径是 `X1 -> X2 -> X3' 并且 C 的值只是过滤,所以它不会不管你如何指定它们。

而如果 X1 和 X2 以及大型表并匹配大量行,则 X3.C 可能是最佳访问路径,因此如何构建查询非常重要:哪个选项最有可能导致优化器使用索引(如果那是更好的计划)还是不使用索引(如果那是更好的计划)?

我认为优化器更有可能选择使用索引进行IN过度LIKE操作。但是,如果我对您的数据库的了解比我现在所知道要多,我不会在它上面投入很多钱。

“它是否重要,例如在一种情况下可能不使用索引”

当然是。索引读取可以更快地获取我们想要的数据。但它们也可能比全表扫描慢。同样是关于数据分布:将返回多少百分比的表行?如果超过 1-2%,则很可能存在比索引更快的访问路径。虽然X3(c, b)在这种情况下索引会提供良好的性能(可惜我们不能总是建立一个索引来适应每个单独的查询)。

于 2012-12-18T13:44:36.560 回答