显式编写索引的优点

时间:2016-01-11 09:39:43

标签: sql sql-server tsql indexing sql-server-2008-r2

我想知道为什么人们应该关心在查询中显式编写索引。我经常看到像这样的查询

@using MyProject.Models;
@model IEnumerable<MyProject.Models.Student>

@{
    ViewBag.Title = "Students";
    ViewInfo viewInfo = ViewBag.ViewInfo;
}

<div class="page-header">
    <h2>Students</h2>
</div>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();

    @Html.DropDownList("StateID", null, new { @class = "form-control" })

    <input type="submit" value="Filter" class="btn btn-primary" />

    // Students Table
}

索引已经定义,查询优化器自己选择最佳索引。编写查询是不是更合乎逻辑,更有效率:

select blabla from Table with(nolock index = index_name)

在查询中显式编写索引有什么好处?

修改 谢谢大家的意见。最好的选择不是强制明确寻求索引。 在这种情况下,只有数据库供应商可能是有利的,并且与性能无关。它们明确指出索引并强制执行计划不要改变,以便能够预测执行时间。

3 个答案:

答案 0 :(得分:2)

这个问题是一种修辞:人们必须衡量效率,而不是理性。

在ssms中,您可以使用“包含实际执行计划”(Ctrl-M)来执行此操作。

尝试在ssms中执行以下内容并查看“执行计划”:

SELECT * FROM msdb.dbo.sysjobs with (index = nc1)

SELECT * FROM msdb.dbo.sysjobs with (index = clust)

SELECT * FROM msdb.dbo.sysjobs 

你会发现:a)第一个索引提示只是放慢速度,b)提示聚集索引,没有提示有相应的计划

答案 1 :(得分:1)

在SQL SERVER中指定索引会导致强制查找该索引。

  

当运行任何查询时,SQL Server Engine会确定必须使用哪个索引   使用。 SQL Server使用基于最低成本的索引   性能。性能最佳的索引是自动的   用过的。在某些情况下,Database Developer是最好的判断   使用的索引。 DBA可以指示SQL Server使用哪个索引   执行查询。

     

如果SQL Server没有选择您创建的索引,   然后尝试使用HINT告诉SQL Server。

您可以参考以下链接

http://blog.sqlauthority.com/2009/02/07/sql-server-introduction-to-force-index-query-hints-index-hint/

https://www.simple-talk.com/sql/performance/index-selection-and-the-query-optimizer/

答案 2 :(得分:1)

我认为,当sql引擎为存储过程中的查询创建执行计划时,它会很有用。这可能是SQL引擎为首先在存储过程中传递的参数(参数嗅探)创建执行计划的情况。对于该值,SQL引擎可以决定不使用索引。因此,为了避免它,您可以显式设置索引使用。

有关参数嗅探的其他信息,请参阅本文(http://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options)和此处(http://www.sommarskog.se/query-plan-mysteries.html