我正在查询一列如
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
我理解这两个查询的含义是不同的,但在我的用例中,它们将返回相同的结果。我想知道哪些查询会更快(并且它是否重要,例如在一种情况下可能不会使用索引)?
答案 0 :(得分:4)
“哪个查询会更快”
......不是我们可以回答的问题。因为您没有提供任何有用的信息。查询性能主要取决于两个因素:数量和偏差。
卷意味着:
歪斜意味着:
这就是为什么收集统计数据很重要,这样数据库就可以理解数据分布并制定适当的执行计划。
例如,如果X1是一个小表并且几乎不匹配X2中的任何行,而X2几乎不匹配X3中的任何行,那么访问路径是`X1 - > X2 - > X3'和C的值只是过滤,所以你指定它们并不重要。
然而,如果X1和X2以及大型表和匹配大量行,X3.C很可能是最佳访问路径,因此构建查询的方式非常重要:哪个选项最有可能导致优化器使用索引(如果这是更好的计划)或不使用索引(如果这是更好的计划)?
我认为优化器更有可能选择在IN
操作上使用LIKE
的索引。但是,如果我不知道 way 更多关于你的数据库的话,我就不会花很多钱。
“它是重要的,例如在一种情况下可能索引没有得到 使用“
当然是。索引读取可以更快地获取我们想要的数据。但它们也可能比全表扫描慢。再次,它是关于数据分布:表的行的百分比将返回?如果它超过1-2%,那么它的访问路径比索引更快。虽然X3(c, b)
上的索引在这种情况下会提供良好的性能(唉,我们不能总是建立一个索引来适应每个单独的查询)。