SQL Server检测慢速和快速列

时间:2015-11-09 22:26:18

标签: sql-server

我有一个ASP.Net MVC应用程序&我使用PetaPoco和SQL Server。

我的用例是我想允许在包含许多字段的表上进行搜索,但隐藏“慢”(即)未编制索引的字段。我将修改PetaPoco T4模板以在列上装饰此信息。

我发现这个answer会给你一个表与索引的列表。我关心的是它显示了特定表的很多列。答案中给出的查询对我的用例是否可靠? (即)显示的列可以包含在where子句&它不会慢?我有一些有40M行的表。我不想在where条件中包含慢列。

或者有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

从问题的意义上讲,没有慢列。您必须区分列的两种用法。

  1. 搜索。当列出现在WHERE或JOIN子句中时,如果没有索引,则会降低查询速度。

  2. 在记录集中返回。如果列出现在SELECT子句中,则无论您是否需要,都必须在每行中返回其内容。因此,对于返回许多行的查询,要返回的每个附加列意味着性能损失。

  3. 结论:正如您所看到的,SELECTED列的性能影响不依赖于索引,而是依赖于返回行的数量。

    建议:为用于搜索的列创建索引,不返回不必要的列。让您的查询在选定列和返回行方面尽可能具体。

答案 1 :(得分:1)

我认为不会那么简单。您可以使用建议的方法(或类似方法)检查​​索引列,但索引中存在列的事实并不意味着您的查询必然会有效地利用它。例如,如果在列A,B和C上创建索引(按此顺序),并且您只有一个' WHERE' B或C上的子句(但不是A)你可能最终会使用索引扫描而不是索引搜索,并且您的查询可能比预期慢。

因此,您的检查应考虑索引中列的顺序 - 即时快速列(在您的情况下)可能会被视为索引的第一列(其中ic.index_column_id = 1在您提到的帖子中) 。只要第一列也包含在过滤器中,索引中不是第一列的列(即ic.index_column_id> 1)将是快的。您可能还需要考虑其他一些事项(例如基数),但这对于确保您推动索引搜索而非扫描非常重要。