SQL Server索引包含列

Ali*_*ice 2 sql sql-server indexing

我需要帮助了解如何创建索引.我有一张看起来像这样的桌子

  • ID
  • 名称
  • 年龄
  • 地点
  • 教育,
  • 电话号码

我的查询如下所示:

SELECT * 
  FROM table1 
 WHERE name = 'sam'
Run Code Online (Sandbox Code Playgroud)
  1. 使用包含的列为此创建索引的正确方法是什么?
  2. 如果查询具有按语句排序怎么办?

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

      SELECT * 
        FROM table1 
       WHERE name = 'sam'
         AND age > 12
    
    Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 5

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

CREATE INDEX idx_table_1 ON db.table_1 (name) INCLUDE (id)
Run Code Online (Sandbox Code Playgroud)

如果Query有一个 ORDER BY

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

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

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

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

但请记住:

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

推荐阅读

我强烈建议阅读金伯利特里普的" 引爆点 ",以便更好地理解指数决策和影响.

  • @BradGagne:"讨厌"是一个强有力的词.现实情况是,我们没有所有数据,可以想象得不到.我们没有相同的硬件,服务器软件版本或网络连接.如果您阅读我链接的文章,您会从行业专家那里看到答案是相同的 - "它取决于".尽管SO试图成为一种资源,但提出问题的人必须面对他们可能不得不弄脏他们的手. (2认同)