2013-03-21 32 views
4

好我是新来这个东西..我已经在我的SP在启动时创建的索引类似如下如何在SQL查询中使用索引

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'. 

或使用该指数查询

,以及如何,如果我们使用的是加入此表上使用索引任何其他方法?

回答

7

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

其次,您的查询不使用索引中提到的列,所以它不会有任何影响。

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

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

3

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

1

如果索引设置正确,优化器将自动使用它。通过适当的设置,我的意思是它有足够的选择性,可以有效地帮助查询等。阅读它。您可以通过使用ssms中的“包含实际执行计划”选项自行检查是否正在使用索引。 一般不建议使用(index())提示,并让优化器自行决定,除非你知道更好的情况非常特殊的情况除外)。

2

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

更多信息:use the index luke

2

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

2

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

既然你是新来这个,你可能会从索引中受益这样的:

Create Index index_fab 
ON TblFab (artc, atelr) 

也许这样

Create Index index_fab 
ON TblFab (atelr, artc) 

...是有很多细微之处来学习。

2

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

2

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

您可以从here几乎读取每个小细节。

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

你还可以尝试:

CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2

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

希望这会有所帮助。

+0

对不起,前英文老师在这里。第二段中的“每个小细节”都应该写成“每一个小细节”。名词前置修饰语“every”是指其具有名词的单数形式,因此“细节”在其复数形式中是无效的。 HTH – 2014-10-10 13:51:06

+0

@Jason如果这是你能找到的一位前英语老师唯一的错误,那么我真的很高兴ESL的演讲者/作家:D – curiousBoy 2015-12-10 17:56:11