SQL Server排序速度慢,有许多常用值

SQL Server排序速度慢,有许多常用值,sql,sql-server,sorting,Sql,Sql Server,Sorting,我有一张发票的视图,上面有客户的名字,诸如此类的东西 这里有几百万行,超过几百个客户。视图的速度非常快,但如果我在客户名称上添加排序,则加载需要一段时间(比如3000毫秒,而不是5毫秒) 查询将发票连接到客户,然后按客户名称排序,然后按订单号排序 我明白为什么-只是想知道是否有什么技巧可以提高排序速度?您可以在客户id/姓名上添加索引 您可以按客户按表进行分区 按排序需要很长时间,因为如果没有索引,它必须读取所有数据。如果使用and索引或表分区,则可以在不读取整个表的情况下获取行 详细说明索引。

我有一张发票的视图,上面有客户的名字,诸如此类的东西

这里有几百万行,超过几百个客户。视图的速度非常快,但如果我在客户名称上添加排序,则加载需要一段时间(比如3000毫秒,而不是5毫秒)

查询将发票连接到客户,然后按客户名称排序,然后按订单号排序


我明白为什么-只是想知道是否有什么技巧可以提高排序速度?

您可以在客户id/姓名上添加索引

您可以按客户按表进行分区

按排序需要很长时间,因为如果没有索引,它必须读取所有数据。如果使用and索引或表分区,则可以在不读取整个表的情况下获取行

详细说明索引。有两个考虑因素。第一个是选择所有行还是仅选择少数行。在大多数情况下,索引肯定有助于第一次记录返回的时间

第二个问题是索引是否有助于获取所有记录。这里的问题是选择性。如果发票表中的一个数据页有几百条记录,而只有几百个客户,那么索引将没有帮助。平均而言,每个页面都会有每个客户

如果一个数据页只有几十张发票,那么平均来说,大约十个页面中只有一个页面会有一张给定的客户发票——瞧,索引会将整个表扫描的I/O减少大约10倍。(还有其他考虑因素,例如预读,但我不考虑这些。)


您没有提供足够的关于系统和表结构的信息来确定答案,但索引可能很有用。

客户名称列上有索引吗?如果这与某些应用程序相关,使用应用程序代码对查询结果进行排序可能会更快。我尝试过使用和不使用这种方法,但都没有什么帮助,因为它必须将每个发票相互比较,因为客户名称是相同的。索引没有帮助,因为这不是瓶颈。我可以针对这个特定的场景进行优化,但我想支持动态排序。有数百万行,所以在应用程序代码中排序不会更快。返回完整的数据集需要更长的时间。你的意思是什么?:-)索引或分区在这种情况下都没有帮助。@Adam。你为什么不这么认为?它应该进行索引扫描以获取行ID。这肯定有助于返回第一行。即使视图需要返回或不返回所有行,几百个客户可能足够有选择性。顺便说一句,这不是我的反对票,而是我的赞成票。可能对OP没什么用处,但对其他有类似问题的读者可能很有用。我觉得我无能为力。我不认为索引会有帮助的原因是因为我尝试了索引。仅按客户名称排序不会太慢。。。加上CustomerName、OrderNumber,它就会变慢。按OrderNumber排序也可以,这是复合排序(我最初的描述缺少这个细节-我很抱歉)。@Adam。您的索引是在CustomerName上还是在CustomerName和OrderNumber上?