繁体   English   中英

SQL 服务器索引包含的列

[英]SQL Server index included columns

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

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

我的查询如下所示:

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

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

     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 语句中有 2 个参数怎么办?

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

但请记住:

  • 调整一个查询不一定会使其他所有查询受益
  • 索引确实会减慢 INSERT/UPDATE/DELETE 语句的速度,并且需要维护
  • 您可以将数据库优化顾问 (DTA) 用于索引建议,包括一些冗余的索引建议

推荐阅读

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

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

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

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

如果插入很少见,请根据需要创建尽可能多的索引。

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

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

使用名称和年龄创建第二个索引。 您只能保留一个索引:'name, ag'e,第一次查询不会慢很多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM