当前位置: 首页 > 面试题库 >

为什么列上的函数会阻止索引的使用?

莫振
2023-03-14
问题内容

关于前几天我问的这个问题,我得到了以下评论。

在几乎所有数据库中,列上的几乎所有函数都会阻止使用索引。到处都有例外,但总的来说,函数会阻止使用索引

我四处搜寻,并发现了更多关于此相同行为的提及,但我很难找到比评论已经告诉我的更深入的信息。

有人可以详细说明为什么会发生这种情况,以及避免这种情况的对策吗?


问题答案:

最基本形式的索引只是排序的列数据,因此可以轻松地按某个值查找。例如,一本教科书可以按一定顺序排列页面,但后面的所有术语都有一个索引。如您所见,数据已预先计算/排序并存储在单独的区域中。

当您将函数应用于列并尝试根据输出进行匹配/过滤时,索引不再有用。让我们再次看一下我们的书籍示例,并说我们正在应用的函数与术语相反(因此reverse('integral')变为'largetni')。您不会在索引中找到此值,因此您必须将所有术语取整,然后将它们放入函数中,然后再进行比较。全部在查询时。本来我们可以跳过搜索i,然后in,再int等等,因此很容易找到长期如此功能使一切慢得多。

如果您经常使用此功能进行查询,则可以reverse(term)提前创建索引以加快查找速度。但是,如果没有明确地这样做,它将总是很慢。



 类似资料:
  • 问题内容: 我的意图是获得客户的分页结果集。我正在使用Tom的这种算法: 我还在“客户”列中定义了一个索引。“ FIRST_NAME”: 该查询返回了预期的结果集,但是从说明计划中,我注意到未使用该索引: 我正在使用Oracle 11g。由于我只查询前20行(按索引列排序),因此我希望使用索引。 为什么Oracle优化器会忽略索引?我认为分页算法有问题,但是我不知道是什么。 谢谢。 问题答案: 您

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 问题内容: 阅读有关ADT列表的Java文档时,它说: List接口提供了四种位置(索引)访问列表元素的方法。列表(如Java数组)从零开始。请注意,对于某些实现(例如,LinkedList类),这些操作可能在时间上与索引值成比例执行。因此,如果调用者不知道实现,则遍历列表中的元素通常比对其进行索引更可取。 这到底是什么意思?我不明白得出的结论。 问题答案: 在链接列表中,每个元素都有一个指向下一

  • 允许您执行以下操作: 但不是这个: 可能是因为返回类型不是函数签名的一部分。但是是一个类类型,它被赋予一个返回类型,并且知道构造它的函数对象的返回类型。所以这里可能有编译器错误。 为什么没有编译器错误?

  • 问题内容: 我有一个简单的Lua脚本: 为什么此脚本阻止Redis服务器?如果我在另一个控制台命令中运行,例如:设置测试1,结果: 问题答案: Redis是单线程的。每个命令都会阻止它。也是命令,因此它会阻止redis。

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码