有办法做到这一点吗?我目前面临的问题是在我的查询中不必要地使用了一个索引(如sql server 2008中查询的执行计划中所示),并且降低了查询性能。该索引不能被删除,因为它对于其他查询很有用。如何停止使用特定查询的数据库索引?
回答
您可以为SQL Server提供查询提示,例如,强迫它使用特定的索引 - 但据我所知,没有办法阻止它使用特定的索引。你能找到一些其他的索引来代替你的查询吗?
此外,在SQL Server 2008中,您还有新的附加查询提示,称为OPTIMIZE FOR
,它可以帮助您为查询优化器定义(并解释)它应该优化的内容。
查看MSDN documentation on query hints了解完整详情。
这是您在添加索引时必须进行的典型和基本的权衡 - 是的,它可能会提高您查看的某个查询的性能 - 但同时可能会减少其他查询。这里真的没有简单的解决方案 - 要么其他查询的收益大于此查询的痛苦 - 然后保持索引。否则,放下它。
使用hints指导优化器使用特定的指标,甚至(从链接)
如果要强制表扫描,使用提示:(INDEX(0))。
我无法想象强迫桌面扫描是一个好主意的许多情况。 – 2010-02-26 06:42:51
当你知道你需要阅读整个表格时如何?你会通过查看索引中的每个条目来阅读整本书籍,然后阅读索引所引用的页面吗? – 2010-03-01 20:33:04
表空间扫描是好的!如果您要读取超过40%的行,那么嗅探整个表并筛选出不需要的行比在索引周围反弹更有效。 – 2010-03-02 07:16:35
不知道这是否仍然有效,但在过去,围绕列名称换行使用通常会阻止索引的使用,例如
where substring(mycol,1,16) = ?
是真的,但那是治疗症状而不是原因... – 2010-02-26 06:43:25
查询提示应避免除非绝对必要(和大部分的时间不需要提示)。使用一个会回来咬你...
我建议你重建你的指数或更新你的统计数据。
我知道这是一个古老的问题,但对于任何绊倒这个(像我一样)的人来说,有一种方法可以防止索引被使用,尽管它有点迂回。
您需要告诉SQL不使用任何索引,然后准确告诉它可以使用哪些索引。
基本上,你最终会得到一个白色的索引列表。
FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex))
此处了解详情:http://msdn.microsoft.com/en-us/library/ms187373.aspx
- 1. 使用数据库函数使用特定索引的JPA查询
- 2. 使用SimpleCursorAdapter如何查询数据库中的特定数据
- 3. 查询来获取其索引在特定数据库
- 4. 如何索引SQL数据库使用对阵查询
- 5. iOS中的firebase数据库查询特定索引中的数据
- 6. 如何停止ThinkingSphinx查询数据库以查看MVA字段?
- 7. 特定索引后停止爆炸
- 8. 的MySQL索引用于特定查询
- 9. 如何停止/杀死特定用户的查询?
- 10. 防止搜索引擎访问特定的数据库字段
- 11. 如何使用索引从数据库索引数据
- 12. 构建sql查询以从数据库检索特定数据
- 13. 如何使用select查询从数据库检索数据
- 14. SQLite查询 - 一旦找到特定项目,停止从数据库返回行
- 15. 阻止使用索引进行查询
- 16. Elasticsearch在特定索引上的查询
- 17. 如何使用索引数据库检索数据库中的数据
- 18. 查询Oracle数据库的功能 - '未定义索引'通知
- 19. 如何使用动态创建的查询搜索数据库?
- 20. Symfony2从数据库查询特定值
- 21. 如何查询特定行值的表的数据库?
- 22. 如何使用mongo数据库查询?
- 23. 跨数据库查询引擎Oracle数据库使用Qt
- 24. 如何停止AJAX查询?
- 25. 如何在Azure的特定数据库中进行查询?
- 26. 聚集索引improvemens特定查询
- 27. 在数据库索引中如何使用二分查找
- 28. 数据库如何使用聚簇索引查找记录?
- 29. 为什么在查询中没有使用特定的索引?
- 30. 如何将数据添加到Firebase数据库中的特定使用引用?
你怎么知道该指数是不必要的? – 2010-02-26 06:41:03
正如我在下面的回答中提到的,在进入索引提示的高级领域之前,应该首先确保您的统计数据是最新的(或重建您的索引) – 2010-02-26 06:52:44
我没有使用构建索引的字段。这就是为什么我认为在这种情况下索引是不必要的 – malay 2010-02-26 09:46:07