数据库查询优化

时间:2012-12-18 13:13:50

标签: sql oracle optimization

我正在查询一列如

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

上编入索引

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

1 个答案:

答案 0 :(得分: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的索引。但是,如果我不知道 way 更多关于你的数据库的话,我就不会花很多钱。

  

“它是重要的,例如在一种情况下可能索引没有得到   使用“

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