Sql server SQL Server检测慢速与快速列

Sql server SQL Server检测慢速与快速列,sql-server,Sql Server,我有一个ASP.NETMVC应用程序&我使用PetaPoco和SQLServer 我的用例是,我希望允许搜索包含许多字段的表,但隐藏“慢”(即未索引)的字段。我将修改PetaPoco T4模板,以在列上装饰此信息 我发现它提供了一个表与索引的列表。我关心的是它显示了一个特定表的许多列。答案中给出的查询对于我的用例是否可靠?(即)显示的列是否可以包含在where子句中&不会太慢?我有一些表格有4000万行。我不想在where条件中包含慢列 还是有更好的方法来解决这个问题?在你的问题中没有慢栏。您必

我有一个ASP.NETMVC应用程序&我使用PetaPoco和SQLServer

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

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


还是有更好的方法来解决这个问题?

在你的问题中没有慢栏。您必须区分列的两种用途

  • 搜索。当列出现在WHERE或JOIN子句中时,如果没有索引,则会减慢查询速度

  • 正在记录集中返回。如果列出现在SELECT子句中,则无论是否需要,它的内容都必须随每行一起返回。因此,对于返回多行的查询,每个额外返回的列都意味着性能损失

  • 结论:如您所见,所选列的性能影响并不取决于索引,而是取决于返回的行数


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

    我认为这不会那么简单。您可以使用建议的方法(或类似方法)检查索引列,但索引中存在列并不意味着您的查询一定会有效地利用它。例如,如果在A、B和C列上创建了索引(按该顺序),而在B或C列上(但在A列上没有)只有一个“WHERE”子句,则可能会以索引扫描而不是索引查找结束,并且查询速度可能会比预期的慢

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