2
|
Mark Brittingham · 技术社区 · 16 年前 |
![]() |
1
1
使用A
索引本身不包含非索引值,它只包含对
要获取非索引值,需要扫描索引并在嵌套循环中从这些块中读取。
根据经验,
如果您需要一个有序查询的所有结果,特别是作为一个部分或更复杂的查询,这意味着
表只需要排序一次,排序结果将被保留并重用。在这种情况下,
如果你需要
而且,索引查找总是响应性更强,因为您可以更快地得到第一行。 |
![]() |
2
1
你的最后一部分是完全正确的。 至于排序问题,在前20个字符的子字符串上排序是否更快。如果字符串为30个字符,则答案为“否”,如果为300个字符,则可能为“是”。我不知道边界在哪里。但它将逐个进行字符排序。如果是21个字符,就可以更快地避免子字符串的额外开销,并让它检查额外的1个字符。 您可以做的是有一个更进一步的列,它是一个截断的描述,并在此列上进行排序。 |
![]() |
3
1
你可能需要考虑的是这一点。在对字符串进行排序时,假设使用了良好的优化算法,就不必分析整个字符串来找出哪个字符串是第一个。考虑这两个字符串
在知道第二个字符串应该排在第一位之前,您只需要分析每个字符串的第一个字符。我不确定这对您的特定数据集起了多大作用,但这是您应该考虑的事情。 作为测试,您可能希望使用完全相同的数据和索引创建表的副本,但将要排序的字段截断为20个字符,并查看由于数据量较小,速度是否有明显的提高。如果性能显著提高,您可能希望按照Robert编写的内容进行操作,并创建第二列,其中的数据已被截断,因此不必使用substring函数。 |
![]() |
4
0
我不这么认为。在这种情况下,调用函数将对性能造成最大的损害。是的,函数很可能使优化器避免索引。 |
![]() |
5
0
您说过忽略[desc]被索引的事实,但是假设[uid]是pk,并且使用聚集索引,您的查询被[desc]上的索引“覆盖”,因此SQL将按索引顺序读取记录…因此,放置子字符串将导致它必须额外执行一步,按前20个字符排序,而它们已经按排序顺序读取了。
通常是的,如果字段在WHERE子句中。应用于WHERE子句中的字段的任何函数都可能导致优化程序跳过索引。一般来说。 |
![]() |
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
![]() |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
![]() |
SoT · SQL Server中求和函数的工作方式 2 年前 |
![]() |
NKAT · 将列值聚合到列表中会产生错误 3 年前 |
![]() |
deanpillow · 返回两列中有一个匹配值的记录 3 年前 |
![]() |
snowflakes74 · 在Dapper中异步查询多个结果 3 年前 |