我使用类似的查询
select.....from.. with... (INDEX=IX_TABLE_1, INDEX=IX_TABLE_2)...
我收到以下错误
每个表只有一个索引提示列表 是允许的
这似乎与SQL Server 2005兼容。这是SQL服务器的问题吗?
答案 0 :(得分:3)
我认为可能是因为你正在使用的语法。
代替(INDEX = IX_TABLE_1,INDEX = IX_TABLE_2),尝试:
(INDEX=IX_TABLE_1, IX_TABLE_2)
我认为你有2个“INDEX =”部分。
此外,我建议仅使用索引提示作为最后的手段,因为查询优化器通常应该选择要使用的最佳计划/索引。这就是为什么一般来说,你应该相信优化器。如果您确实使用了索引提示,那么最好经常查看它们,因为它们可能会随着时间的推移而变得更糟(例如,随着数据量的增长,最初使用提示表现得更好,可能会开始表现更差)。
答案 1 :(得分:-1)
实际上,你不应该首先给出索引提示。
如果优化器似乎在愚蠢地选择使用哪些索引;这通常需要进一步调查。
其次,请确保优化器不拒绝特定索引,因为实际上所述索引 会降低 性能。例如,您可能想要执行以下操作之一:
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一起运行良好。
我不得不问:你确定吗? 我试了一下;并且它没有引起错误消息 - 它严重混淆了优化器。它强制优化器遍历同一个表两次( 不必要地 )并将结果集重新加入 - 导致巨大的开销!!