如何在SQL查询中使用索引

8
“我对这个东西还很陌生...在一开始,我创建了一个索引,如下所示,在我的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'.

或者使用任何其他方法来在查询中使用此索引,同时如果我们在该表上使用连接操作,也要知道如何使用索引?
8个回答

12

首先,你是指在存储过程中创建索引吗?这是一个不好的想法 - 如果你运行存储过程两次,它将失败,因为索引已经存在。

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

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

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


4
作为其他人回答您的问题以帮助您更好地理解的补充,我的观点是,您应该首先了解为什么需要使用索引。正如我们所知,索引可以提高性能,但它们也可能导致性能问题。最好知道何时需要使用索引,为什么需要使用索引,而不是如何使用索引。
您可以从这里阅读几乎每一个细节。
关于您的示例,查询的索引没有影响。因为您的查询的where子句中没有提到该列。
您还可以尝试: CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2) 还有一些值得了解的信息:如果表上不存在索引,则必须为数据库查询中引用的每个表执行表扫描。表越大,表扫描所需时间就越长,因为表扫描要求按顺序访问每个表行。虽然对于需要访问表中大部分行的复杂查询,表扫描可能更有效率,但对于仅返回某些表行的查询,索引扫描可以更有效地访问表行。(来源:这里
希望对您有所帮助。

抱歉,我曾经是一名英语教师。第二段中的“Every little details”应更正为“every little detail”。名词前置修饰语“every”指代其所修饰的名词为单数形式,因此“details”的复数形式是无效的。希望对你有所帮助。 - user724198
@Jason 如果这是你作为一名前英语教师能找到的唯一错误,那么作为一名英语学习者,我感到非常高兴:D - curiousBoy

3

SQL Server的查询优化器会决定索引是否适用于查询。您不能“强制”它使用特定的索引。您可以暗示您想要使用哪个索引,但这并不保证它会使用该索引。


2

您的索引使用了“Fab_name”列,但在选择语句中未对其进行筛选,因此它没有用处。

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

Create Index index_fab
ON TblFab (artc, atelr)

或者可能像这样

Create Index index_fab
ON TblFab (atelr, artc)

是的,有很多微妙之处需要学习。


2
如果您使用索引查询表,则默认情况下应该使用它。但是,我认为在您发布的查询中不会使用它,因为您没有通过创建索引的列过滤数据。我认为您需要为artc和atelr列创建索引才能从中受益。要查看索引是否被使用,请查看SQL Management Studio中使用的执行计划。更多关于索引的信息请参见:use the index luke

2

在查询中,您不需要包含索引,因为它由SQL服务器管理。如果要将此表连接到其他表,则也不需要在SELECT语句中包含索引。希望这清楚了。


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

1
如果索引设置正确,优化器会自动使用它。我所说的正确设置是指它足够有选择性,可以有效地帮助查询等。阅读相关内容。您可以通过在ssms中使用“包括实际执行计划”选项来自行检查是否正在使用索引。 通常不建议使用with(index())提示,让优化器自行决定,除非是在非常特殊的情况下您更清楚。;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接