【问题标题】:How to use index in SQL query如何在 SQL 查询中使用索引
【发布时间】:2013-03-10 20:50:10
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    其次,你的查询没有用到索引中提到的列,所以不会有影响。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        你也可以试试:

        CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2)

        另外值得了解的是:如果表上不存在索引,则必须对数据库查询中引用的每个表执行表扫描。表越大,表扫描所需的时间就越长,因为表扫描需要按顺序访问每个表行。尽管对于需要表中大部分行的复杂查询,表扫描可能更有效,但对于只返回一些表行的查询,索引扫描可以更有效地访问表行。 (来源here

        希望这会有所帮助。

        【讨论】:

        • 对不起,这里的前英语老师。第二段中的“每一个小细节”应改为“每一个小细节”。名词前置修饰语“every”指其拥有的名词为单数形式,因此“details”的复数形式无效。 HTH
        • @Jason 如果这是作为一名前英语老师你能找到的唯一错误,我很高兴作为一名 ESL 演讲者/作家 :D
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            您的索引使用“Fab_name”列,您没有在选择语句中过滤,所以它没有用。

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

            Create Index index_fab
            ON TblFab (artc, atelr)
            

            或者像这样

            Create Index index_fab
            ON TblFab (atelr, artc)
            

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 2014-02-13
                  • 2012-07-09
                  • 2019-11-12
                  • 2018-10-23
                  • 2013-06-25
                  • 2015-08-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多