我查询一个列,如下所示
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上建立了索引
我知道这两个查询的含义是不同的,但在我的用例中,它们将返回相同的结果。我想知道哪些查询会更快(这是否重要,例如,在一种情况下,可能不使用索引)?
发布于 2012-12-18 21:44:37
“哪个查询会更快”
..。不是我们能回答的问题。因为你没有提供任何有用的信息。查询性能很大程度上取决于两个因素:量和偏差。
音量意味着:
倾斜意味着:
这就是为什么收集统计数据很重要,这样数据库就可以了解数据分布并设计适当的执行计划。
例如,如果X1是一个很小的表,它几乎不匹配X2中的任何行,而X2几乎不匹配X3中的任何行,那么访问路径是‘x1 -> X2 -> X3’,C的值只是过滤,所以如何指定它们并不重要。
然而,如果X1和X2以及大型表匹配了许多行,那么X3.C可能是最佳访问路径,因此如何构建查询非常重要:哪个选项最有可能导致优化器使用索引(如果这是更好的计划)或不使用索引(如果这是更好的计划)?
我认为优化器更有可能选择在LIKE操作上为IN使用索引。但我不会在没有比我现在更了解你的数据库的情况下下太多的钱。
“这是否重要,例如,在一种情况下,索引可能不会被使用”
它当然是的。索引读取可能是获取我们想要的数据的更快方法。但它们也可能比全表扫描慢。同样,它也是关于数据分布的:表行的返回率是多少?如果大于1-2%,则很可能存在比索引更快的访问路径。尽管在这种情况下,X3(c, b)上的索引可以提供良好的性能(可惜,我们不能总是为每个查询构建一个索引)。
https://stackoverflow.com/questions/13933828
复制相似问题