我需要帮助了解如何创建索引。我有一个像这样的表
- Id <
- 名称/gh>年龄
- <
- 教育/gh>
- PhoneNumber
我的查询是这样的:
SELECT *
FROM table1
WHERE name = 'sam'
- 创建包含列的索引的正确方法是什么?
如果查询有order by语句怎么办?
SELECT * FROM table1 WHERE name = 'sam' ORDER BY id DESC
如果我有2个参数在我的where语句?
SELECT * FROM table1 WHERE name = 'sam' AND age > 12
创建包含列的索引的正确方法?通过Management Studio/Toad/etc,或者SQL(文档):
CREATE INDEX idx_table_1 ON db.table_1 (name) INCLUDE (id)
如果查询有一个ORDER BY
ORDER BY
可以使用索引,如果优化器认为合适(由表统计信息决定&查询)。您可以通过查看查询成本来测试复合索引或具有INCLUDE
列的索引是否工作得最好。
如果id
是集群键(不总是主键),我可能不会包括列…
如果我有两个参数在我的where语句?
和上面一样,你需要测试什么最适合你的查询。可以是复合索引、包含索引或单独索引。
但是要记住:
- 对一个查询进行调整不一定会使其他查询受益
- 索引确实降低了INSERT/UPDATE/DELETE语句的速度,并且需要维护
- 您可以使用数据库调优顾问(DTA)提供索引建议,包括当一些索引是冗余的
我强烈推荐阅读Kimberly Tripp的《The Tipping Point》,以更好地理解指数决策和影响。
由于我不知道您的数据库将实现哪些任务以及其中有多少记录,因此我建议您查看Index Basics MSDN文章。它将允许您自己决定创建哪些索引。
如果ID
是您的主索引键和/或聚集索引键,只需在Name, Age
上创建索引。这将涵盖所有三个查询。
包含字段最好用于检索不在筛选器列表中的列的行级值,或者检索排序字段位于GROUP BY
子句中的聚合值。
如果插入很少,创建尽可能多的索引
为第一个查询创建索引
Id column I think already is primary key.
创建第二个包含姓名和年龄的索引。你可以只保留一个索引:'name, ag',它不会慢太多的第一次查询