我想知道为什么人们应该关心在查询中显式编写索引。我经常看到像这样的查询
@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)
在查询中显式编写索引有什么好处?
修改 谢谢大家的意见。最好的选择不是强制明确寻求索引。 在这种情况下,只有数据库供应商可能是有利的,并且与性能无关。它们明确指出索引并强制执行计划不要改变,以便能够预测执行时间。
答案 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。
您可以参考以下链接
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)