如何在SQL查询中使用索引

时间:2013-03-21 11:13:54

标签: sql sql-server sql-server-2008 stored-procedures indexing

嗯,我是这个东西的新手..我在开始时在我的SP中创建了一个索引,如下所示

Create Index index_fab
ON TblFab (Fab_name)

现在我在此

下进行查询
select fab_name from TblFab where artc = 'x' and atelr = 'y'.

现在是否有必要在select子句中使用此索引名称,否则它将自动用于加速查询

我是否必须使用类似

的内容
select fab_name from TblFab WITH(INDEX(index_fab)) where artc = 'x' and atelr = 'y'.

或在查询中使用此索引的任何其他方法

以及如果我们在这个表上使用join,如何使用索引?

8 个答案:

答案 0 :(得分:9)

首先,您是说您是在存储过程中创建索引吗?这是一个坏主意 - 如果您运行存储过程两次,它将失败,因为索引已经存在。

其次,您的查询不使用索引中提到的列,因此它不会产生任何影响。

第三,正如JodyT所写,查询分析器(SQL Server本身)将决定使用哪个索引;它几乎肯定比你更好。

最后,为了加快您提到的查询速度,请在artc和atelr列上创建索引。

答案 1 :(得分:3)

SQL Server的查询优化器将决定索引是否适合查询。您不能force使用特定索引。您可以提供您希望它使用的提示,但不能保证它会使用它。

答案 2 :(得分:3)

当其他人回答你的问题以帮助你更好地理解时,我的意见是,你应该先了解为什么需要使用索引。我们知道索引会提高性能,但它们也可能导致性能问题。最好知道何时需要使用索引,为什么需要使用索引而不是如何使用索引。

您可以阅读here中的几乎所有细节。

关于您的示例,您的查询的索引没有任何影响。因为它在查询的where子句中没有提到的列。

您也可以尝试:

CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2

另外要知道:如果表中不存在索引,则必须对数据库查询中引用的每个表执行表扫描。表越大,表扫描所用的时间越长,因为表扫描需要按顺序访问每个表行。虽然对于需要表中大多数行的复杂查询,表扫描可能更有效,但对于仅返回某些表行的查询,索引扫描可以更有效地访问表行。 (来自here

希望这有帮助。

答案 3 :(得分:2)

如果使用它对表运行查询,则默认情况下应使用索引。 但我认为在您发布的查询中不会使用它,因为您没有按照创建索引的列过滤数据。 我认为你必须为artc和atelr列创建索引以从中获利。 要查看您的索引是否使用,请查看SQL Management Studio中使用的执行计划。

有关指数的更多信息:use the index luke

答案 4 :(得分:2)

您不需要在查询中包含索引。它由sql server管理。如果你想连接到这个表,你也不需要在select中包含索引。希望它清楚。

答案 5 :(得分:2)

你是索引使用“Fab_name”列,你没有在你的select语句中过滤,所以它是没用的。

由于您是新手,您可能会受益于这样的索引:

Create Index index_fab
ON TblFab (artc, atelr)

或者可能是这样的

Create Index index_fab
ON TblFab (atelr, artc)

...是的,需要学习很多细微之处。

答案 6 :(得分:2)

为了获得更好的表现: 列出经常使用的列/表, 仅在这些表/列上创建索引。

答案 7 :(得分:1)

如果正确设置了索引,优化程序将自动使用它。通过适当的设置,我的意思是它足够有选择性,可以有效地帮助查询等。阅读它。您可以通过在ssms中使用“include actual execution plan”选项来自行检查是否正在使用索引。 通常不建议使用(index())提示并让优化器自己决定,除非你知道更好的非常特殊情况;)。