gpt4 book ai didi

sql-server - 在 SQL Server 中,按短子字符串排序是否比按整个长字段排序更有效?

转载 作者:行者123 更新时间:2023-12-04 07:09:55 26 4
gpt4 key购买 nike

考虑以下 SQL Server 2005/2008 查询:

Select [UID], [DESC] From SomeTable Order By [Desc];

如果 Desc 是一个相当长的字段(Varchar(125) 有许多条目 > 70 个字符)并且您不需要严格排序,那么这样做会更有效吗:
Select [UID], [DESC] From SomeTable Order By Substring([Desc], 0, 20);

优点是所有比较都很短(最多 20 个字符)。缺点是它会引发 Substring 调用。出于目前的目的,假设您不想在该字段上放置索引,因为这不是主键,并且上述操作相当罕见。你会选择哪个选项?

注2:我在这里问的主要是出于好奇。在我的应用程序中,Desc 是一个索引字段,我没有使用子字符串。但是,我简要地考虑过使用 Substring 并且突然想到我并不真正知道上述哪种方法会更有效。

最后,一个额外的问题:在 Indexed 字段上使用 Substring 是否会使优化器跳过索引并真正减慢速度?如果使用 Substring(即使使用零基数),我认为优化器不够聪明以使用索引,但我现在有点忙,无法对其进行测试。但是,如果您有不同的了解,请纠正我!

更新/澄清:您应该假设 Desc 字段未针对原始问题编制索引。如果它被索引,答案很简单。

最佳答案

使用 non-clustered index隐含 JOIN .

索引本身不包含非索引值,它只包含对 TABLE 的引用。的块。

要获取非索引值,您需要扫描索引并在嵌套循环中从这些块中读取。

根据经验,INDEX SCAN WITH TABLE LOOKUP是关于10成本是 TABLE SCAN 的两倍.

如果您需要有序查询的所有结果,尤其是作为暗示 nested loops 的一部分或更复杂的查询,有时执行 TABLE SCAN 更有效并对结果进行排序。

表只需要排序一次,排序的结果将被保留和重用。在这种情况下,SUBSTRING可能效率更高。

如果您需要 5%排序结果或更少,则 INDEX SCAN将更有效率,在这种情况下,您需要对整个列进行排序。

此外,索引查找总是更具响应性,因为您可以更快地获得第一行。

关于sql-server - 在 SQL Server 中,按短子字符串排序是否比按整个长字段排序更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com