嗯,我是这个东西的新手..我在开始时在我的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,如何使用索引?
答案 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())提示并让优化器自己决定,除非你知道更好的非常特殊情况;)。