具有多个索引的SQL查询 - SQL Server 2000

时间:2010-01-29 12:36:36

标签: sql sql-server-2005 sql-server-2000 indexing

我使用类似的查询

select.....from.. with... (INDEX=IX_TABLE_1, INDEX=IX_TABLE_2)...

我收到以下错误

  

每个表只有一个索引提示列表   是允许的

这似乎与SQL Server 2005兼容。这是SQL服务器的问题吗?

2 个答案:

答案 0 :(得分:3)

认为可能是因为你正在使用的语法。

代替(INDEX = IX_TABLE_1,INDEX = IX_TABLE_2),尝试:

(INDEX=IX_TABLE_1, IX_TABLE_2)

我认为你有2个“INDEX =”部分。

此外,我建议仅使用索引提示作为最后的手段,因为查询优化器通常应该选择要使用的最佳计划/索引。这就是为什么一般来说,你应该相信优化器。如果您确实使用了索引提示,那么最好经常查看它们,因为它们可能会随着时间的推移而变得更糟(例如,随着数据量的增长,最初使用提示表现得更好,可能会开始表现更差)。

答案 1 :(得分:-1)

实际上,你不应该首先给出索引提示。

解释

  1. SQL语言背后的目标之一是将“what”与“how”分开。换一种说法;您的查询应指明您需要的结果集的规则,而不是数据访问路径(这正是索引提示的作用)。
  2. 通过将查询绑定到特定索引,您将无法通过添加更好的索引来提高性能。即您还必须修改您的查询。
  3. 许多提示选项都是特定于平台的;当你使用它们时,你会降低可移植性。
  4. 编写查询优化器是为了考虑所有索引,各种连接方案,最重要的是;表格中数据的统计信息。即使你能够自己覆盖所有这些基础,并确定今天使用的理想指标;在6个月的时间内,您数据库中某些值,记录,引用的统计频率可能已经发生变化 - 您的索引选择可能不再有任何好处!
  5. 旁注

    如果优化器似乎在愚蠢地选择使用哪些索引;这通常需要进一步调查。

    • 作为第一步;您的表格统计数据是否合理最新?
    • 其次,请确保优化器不拒绝特定索引,因为实际上所述索引 会降低 性能。例如,您可能想要执行以下操作之一:

      SELECT  Col1, Col2, Col3, ...
      FROM    Customers WITH (INDEX=IndexByName)
      WHERE   FistName LIKE 'A%'
      
      SELECT  Col1, Col2, Col3, ...
      FROM    Customers WITH (INDEX=IndexByName)
      ORDER BY FirstName
      

    索引提示似乎完全符合逻辑;但是:

    • 如果索引是聚簇的,或覆盖索引:无论如何都会使用它 - 没有提示。
    • 如果索引是非群集且不覆盖的:检索的每条记录都需要进行书签查找。这会产生巨大的开销;特别是在磁盘搜索活动上。因此,毕竟索引是一个糟糕的选择。

    最后

    我不确定是不是这样;但是您的问题并不表示它是一个复杂的多表查询。事实上它可能实际上是如此微不足道的?

    SELECT  Col1, Col2, ...
    FROM    ATable WITH (INDEX=Index1, INDEX=Index2)
    

    无论情况如何,单个表的提示多个索引当然没有任何意义(除非它与自连接一起使用多次)。你说:

      

    这似乎与SQL Server 2005一起运行良好。

    我不得不问:你确定吗? 我试了一下;并且它没有引起错误消息 - 它严重混淆了优化器。它强制优化器遍历同一个表两次( 不必要地 )并将结果集重新加入 - 导致巨大的开销!!