![]() |
1
19
假设最高性能是目标,我理想地选择
正如其他人指出的,
如果6是一个变量(例如,您有时希望搜索前6个字符,有时希望搜索不同的数字),则可能无法找到支持该查询的基于函数的索引。在这种情况下,使用类似的公式,您可能更好地处理优化器决策的变幻莫测。 |
![]() |
2
9
在提供的两个选项中,肯定是喜欢的。必须对表中的所有行执行子字符串方法。使用like将允许使用索引。 要检查我的答案,只需分析结果。天晴了。 |
![]() |
3
2
如果我的域上有索引,那么like可能更快。做你自己的基准。 |
![]() |
4
2
如果你有 无索引 比没有区别。因为Oracle正在进行全表扫描,并为每一行计算表达式。 您可以在列上放置索引,以加快两个查询的速度。
此索引更灵活,并使用like加快查询速度。它可以用于任何比较,从字符开始,在结尾有占位符(%)。Oracle正在进行索引范围扫描以查找所有匹配的行。
此索引使用SUBSTR加速查询。但是索引非常特殊,只能比较前6个字符。 如果您查询的是从中间开始的一段。创建基于函数的索引将有所帮助。
|
![]() |
5
1
这里有两个问题:
这可能因版本而异,但两者都很容易测试,这样您就可以确定您的版本和数据具有最佳的信息。 为两个查询运行执行计划,使用…
和
您可能会看到执行计划中的差异,这取决于索引等的存在,但也会将基数估计值与您从中获得的实际结果进行比较:
两种方法中的一种可能比另一种更精确。 如果两者都不准确 和 该查询预计会运行一段非常长的时间,然后考虑使用动态采样来改进估计,因为使用错误的基数估计,优化器无论如何可能会选择次优的访问方法。
就索引用法而言,两种方法都可以使用基于索引的访问方法。like谓词可能对索引更友好,可以使用范围扫描或快速完整索引扫描。SUBSTR方法当然可以使用快速完整索引扫描,但是优化器是否会考虑范围扫描最好在您自己的版本上进行测试——我记得它不会,但谁会说SUBSTR(我的专栏, 一 ,n)如果不是现在,将来不会被视为特殊情况? |
![]() |
6
0
我会同时介绍这两种情况。但我想“like”会快得多,因为它使用索引上的二进制搜索(如果字段是索引的)。如果您使用SUBSTR方法,您将得到一个完整的表扫描,因为Oracle必须逐行处理函数。 |
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |