5

好吧,我对这些东西很陌生..我在一开始就在我的 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'.

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

如果我们在这个表上使用连接,如何使用索引?

4

8 回答 8

9

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

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

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

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

于 2013-03-21T11:19:54.063 回答
3

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

你可以从这里阅读几乎每一个小细节。

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

你也可以试试:

CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2)

也很高兴知道:如果表上不存在索引,则必须对数据库查询中引用的每个表执行表扫描。表越大,表扫描所需的时间就越长,因为表扫描需要按顺序访问每个表行。尽管对于需要表中大部分行的复杂查询,表扫描可能更有效,但对于只返回一些表行的查询,索引扫描可以更有效地访问表行。(来自这里

希望这可以帮助。

于 2013-11-04T20:50:59.783 回答
3

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

于 2013-03-21T11:14:58.267 回答
2

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

有关索引的更多信息:使用索引卢克

于 2013-03-21T11:19:22.237 回答
2

您不需要在查询中包含索引。它由 sql server 管理。此外,如果要加入此表,则不需要在 select 中包含索引。希望它清楚。

于 2013-03-21T11:19:33.413 回答
2

您在 select 语句中使用了未过滤的“Fab_name”列,所以它没有用。

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

Create Index index_fab
ON TblFab (artc, atelr)

或者像这样

Create Index index_fab
ON TblFab (atelr, artc)

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

于 2013-03-21T11:24:12.233 回答
2

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

于 2013-10-15T07:59:27.957 回答
1

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

于 2013-03-21T11:18:10.563 回答