SQL Server索引包含列

时间:2011-07-08 17:14:49

标签: sql sql-server indexing

我需要帮助了解如何创建索引。我有一个看起来像这样的表

  • 编号
  • 名称
  • 年龄
  • 位置
  • 教育,
  • ******中国

我的查询如下:

SELECT * 
  FROM table1 
 WHERE name = 'sam'
  1. 使用包含列创建索引的正确方法是什么?
  2. 如果查询具有按语句排序,该怎么办?

      SELECT * 
        FROM table1 
       WHERE name = 'sam'
    ORDER BY id DESC
    
  3. 如果我在where语句中有2个参数怎么办?

      SELECT * 
        FROM table1 
       WHERE name = 'sam'
         AND age > 12
    

4 个答案:

答案 0 :(得分:5)

使用包含列创建索引的正确方法?通过Management Studio / Toad / etc或SQL(documentation):

CREATE INDEX idx_table_1 ON db.table_1 (name) INCLUDE (id)

如果查询具有ORDER BY

,该怎么办?

ORDER BY可以使用索引,如果优化器认为合适(由表统计和查询确定)。您可以通过查看查询成本来测试复合索引或带有INCLUDE列的索引是否最佳。

如果id是群集密钥(虽然不总是主密钥),我可能不会包含该列...

如果我在where语句中有2个参数怎么办?

与上述相同 - 您需要测试哪种方法最适合您的查询。可能是复合,包含或单独的索引。

但请记住:

  • 调整一个查询不一定会使所有其他查询受益
  • 索引会降低INSERT / UPDATE / DELETE语句的速度,并需要维护
  • 您可以使用数据库优化顾问(DTA)获取索引建议,包括某些内容是多余的

推荐阅读

我强烈建议您阅读Kimberly Tripp的“The Tipping Point”,以便更好地了解指数决策和影响。

答案 1 :(得分:0)

由于我不知道您的数据库将要实现哪些确切的任务以及其中包含多少记录,因此我建议您查看Index Basics MSDN文章。它将允许您自己决定要创建哪些索引。

答案 2 :(得分:0)

如果ID是您的主要和/或聚集索引键,只需在Name, Age上创建索引即可。这将涵盖所有三个查询。

包含的字段最适用于检索不在筛选器列表中的列的行级值,或检索排序字段位于GROUP BY子句中的聚合值。

答案 3 :(得分:-1)

如果插入很少,请创建所需数量的索引。

对于第一个查询,为name列创建索引。

Id列我认为已经是主键......

创建名称和年龄的第二个索引。你只能保留一个索引:'name,ag'e,第一次查询的速度不会太慢。