在我前几天问的this question上,我得到了以下评论。
在几乎任何数据库中,列上的几乎任何函数都会阻止索引的使用。这里和那里都有例外,但总的来说,函数阻止了索引的使用。
我搜索了一下,发现了更多关于这种行为的信息,但是我很难找到比评论告诉我更深入的东西。
有人能详细说明为什么会发生这种情况吗?也许是避免这种情况的策略?
发布于 2016-06-20 16:17:52
索引最基本的形式就是排序的列数据,这样就很容易通过一些值来查找。例如,教科书可以按一定顺序排列页面,但在后面为所有术语设置索引。如您所见,数据是预先计算/排序的,并存储在单独的区域中。
当您将函数应用到列并尝试根据输出匹配/筛选时,索引将不再有用。让我们再看一看我们的书中的示例,并说我们正在应用的函数与术语相反(因此reverse('integral')变成了'largetni')。您将在索引中找不到这个值,所以您必须接受所有的术语,将它们放在函数中,然后再进行比较。都是在查询时间。最初,我们可以跳过对i的搜索,然后跳过in,然后跳过int等等,这样就很容易找到这个词,因此函数使一切变得更慢。
如果经常使用此函数进行查询,则可以提前使用reverse(term)创建索引,以加快查找速度。但如果不明确地这样做,它将永远是缓慢的。
发布于 2016-06-20 16:13:18
索引与SQL服务器上的数据本身分开存储。因此,当您执行查询时,应该引用以提供速度的B树索引将不再被引用,因为每个列上都有一个操作(函数),因此查询优化器将选择不再使用该索引。
发布于 2016-06-20 16:13:21
这里很好地解释了为什么会发生这种情况(这是一篇特定于Server的文章,但可能适用于其他systems系统):
文章中真正突出的一行是“原因是,必须对每一行数据进行函数值的计算,以确定其是否与您的标准相匹配”。
https://stackoverflow.com/questions/37927069
复制相似问题