繁体   English   中英

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

[英]SQL query with multiple indexes - SQL server 2000

我使用类似的查询

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

我收到以下错误

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

这似乎可以与SQL Server 2005一起很好地工作。SQLServer是否有问题?

认为可能是因为您使用的语法。

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

(INDEX=IX_TABLE_1, IX_TABLE_2)

我认为这是事实,您有2个“ INDEX =“部分。

另外,我建议仅将索引提示用作最后的选择,因为查询优化程序通常应选择要使用的最佳计划/索引。 这就是为什么通常应该信任优化器的原因。 如果您确实使用了索引提示,则最好经常对其进行检查,因为它们可能会随着时间的流逝而变得越来越差(例如,随着数据量的增长,最初在该提示下表现更好的内容可能会开始变差)。

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

说明

  1. SQL语言的目标之一是将“什么”与“如何”分开。 换一种说法; 您的查询应指示所需结果集的规则,而不是数据访问路径(这正是索引提示的作用)。
  2. 通过将查询绑定到特定索引,您将失去通过添加更好的索引来提高性能的能力。 即,您还必须修改您的查询。
  3. 许多提示选项是特定于平台的。 使用它们会降低便携性。
  4. 查询优化程序已编写为考虑所有索引,各种连接方案,最重要的是, 有关表中数据的统计信息。 即使您能够自己涵盖所有这些基础,并确定今天要使用的理想索引; 在6个月的时间内,数据库中某些值,记录,引用的统计频率可能已更改-选择索引可能不再有效!

边注

如果优化程序似乎在选择要使用的索引方面很愚蠢; 这通常值得进一步调查。

  • 第一步; 您的表统计信息是否合理更新?
  • 其次,请确保优化程序不会拒绝特定索引,因为实际上该索引会降低性能。 例如,您可能很想执行以下操作之一:

     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配合良好。

我不得不问:您确定吗?
我试了一下 并没有导致错误消息-严重混淆了优化器。 它迫使优化器遍历同一张表两次( 不必要 ),并将结果集彼此重新连接-产生了巨大的开销!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM