SQL Server索引包括列



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

  • Id
  • <
  • 名称/gh>年龄
  • <
  • 教育/gh>
  • PhoneNumber

我的查询是这样的:

SELECT * 
  FROM table1 
 WHERE name = 'sam'
  1. 创建包含列的索引的正确方法是什么?
  2. 如果查询有order by语句怎么办?

      SELECT * 
        FROM table1 
       WHERE name = 'sam'
    ORDER BY id DESC
    
  3. 如果我有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',它不会慢太多的第一次查询

最新更新