在SQL Server的同一列上创建多个非聚集索引

用户名

什么是索引创建策略?

是否可以在SQL Server的同一列上创建多个非聚集索引?

如何在同一列上创建群集和非群集?

非常抱歉,但是索引对我来说很混乱。

有没有办法找出SQL Server中估计的查询执行时间?

卡恩

这些词很合逻辑,您会很快学会它们。:)

用外行的术语来说,SEEK意味着寻找记录的精确位置,这是当您要搜索的列被索引并且过滤器(WHERE条件)足够准确时,SQL Server会执行的操作。

SCAN意味着更大范围的行,在该行中查询执行计划者估计,与单独查找每个值相比,获取整个范围的速度更快。

是的,您可以在同一字段上拥有多个索引,有时这是一个非常好的主意。播放索引并使用查询执行计划程序确定会发生什么(SSMS中的快捷键:Ctrl + M)。您甚至可以运行同一查询的两个版本,执行计划程序将轻松显示每个版本占用了多少资源和时间,从而使优化变得非常容易。

但是,请进一步扩展一下,假设您有一个这样的地址表,它有超过10亿条记录:

CREATE TABLE ADDRESS 
  (ADDRESS_ID INT -- CLUSTERED primary key ADRESS_PK_IDX
  , PERSON_ID INT -- FOREIGN KEY, NONCLUSTERED INDEX ADDRESS_PERSON_IDX
  , CITY VARCHAR(256)
  , MARKED_FOR_CHECKUP BIT
  , **+n^10 different other columns...**)

现在,如果要查找人员12345的所有地址信息,则PERSON_ID上的索引是完美的。由于该表在同一行上具有其他数据的负载,因此创建一个非聚集索引来覆盖所有其他列以及PERSON_ID将会效率低下且占用空间。在这种情况下,SQL Server将对PERSON_ID中的索引执行索引SEEK,然后使用该索引对ADDRESS_ID中的聚集索引进行键查找,然后从该行返回同一行所有其他列中的所有数据。

但是,假设您要搜索城市中的所有人员,但是不需要其他地址信息。这次,最有效的方法是在CITY上创建索引,并使用INCLUDE选项覆盖PERSON_ID。这样,一次索引查找/扫描将返回您需要的所有信息,而无需诉诸于CLUSTERED索引来检查同一行上的PERSON_ID数据。

现在,假设这两个查询都是必需的,但由于有10亿条记录,因此仍然相当繁重。但是有一个特殊的查询需要非常快。该查询希望地址为MARKED_FOR_CHECKUP且必须居住在纽约的所有人员(忽略任何检查手段,这无关紧要)。现在,您可能想在MARKED_FOR_CHECKUP和CITY上创建第三个过滤索引,INCLUDE覆盖PERSON_ID,并且过滤器说CITY ='New York'和MARKED_FOR_CHECKUP =1。该索引将非常快,因为它只覆盖查询满足这些确切条件的数据,因此与其他索引相比,要通过的数据只有一小部分。

(这里的免责声明,请记住,查询执行计划器不是愚蠢的,它可以将多个非聚集索引一起使用以产生正确的结果,因此上面的示例可能不是最好的,因为很难想象何时需要3个不同的索引涵盖了同一列,但我敢肯定您的想法。)

索引的类型,它们的列,包括的列,排序顺序,过滤器等完全取决于情况。您将需要进行覆盖索引以满足几种不同类型的查询,以及专门为单个重要查询创建的自定义索引。每个索引都占用HDD上的空间,因此,使无用的索引很浪费,并且每当数据模型发生变化时都需要额外的维护,尽管这样会浪费磁盘碎片整理和统计信息更新操作的时间...所以您不想只对所有对象都使用索引要么。

实验,学习和制定最适合您需求的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL-比较同一列中的多个值?

来自分类Dev

SQL Server是否在非聚集非唯一索引中索引空值?

来自分类Dev

为什么在SQL Server中每个表只能创建一个聚集索引?

来自分类Dev

SQL Server:创建非聚集索引而不给其命名

来自分类Dev

SQL查询可在同一列上实现多个WHERE条件

来自分类Dev

如何获取在SQL Server的另一列上具有多个值的行?

来自分类Dev

在同一列上具有2个INNER JOIN的SQL不起作用

来自分类Dev

在SQL Server中,多列非聚集索引中的列顺序是否重要?

来自分类Dev

在同一列SQL中创建对数值

来自分类Dev

SQL Multiple在同一列上选择

来自分类Dev

索引视图上的SQL Server列存储聚集索引

来自分类Dev

SQL Server索引-在组合键字段上创建非聚集索引有什么好处?

来自分类Dev

SQL Server:合并(插入/更新)后的非聚集索引

来自分类Dev

如何在SQL的同一列上创建多个条件

来自分类Dev

SQL Server:聚集索引比等效的非聚集索引慢得多

来自分类Dev

同一列上有多个SQL过滤器

来自分类Dev

SQL查询一列上的多列DISTINCT

来自分类Dev

具有多列的SQL Server非聚集索引

来自分类Dev

SQL Server:在一列上有多个选择语句

来自分类Dev

当在同一列上定义主键时,仍需要SQL Server索引吗?

来自分类Dev

索引视图上的SQL Server列存储聚集索引

来自分类Dev

非唯一列上的SQL Server聚集索引

来自分类Dev

具有多个事件的DateDiff同一列SQL Server

来自分类Dev

在多表SQL中选择同一列的非重复

来自分类Dev

嵌套在一列上的 Sql 比较

来自分类Dev

SQL Server 非聚集索引 - 包括值

来自分类Dev

同一个表的列上的 SQL 连接与另一列上的 MAX

来自分类Dev

sql server 如何在复合非聚集索引中查找?

来自分类Dev

SQL 来自同一列的上一行

Related 相关文章

  1. 1

    SQL-比较同一列中的多个值?

  2. 2

    SQL Server是否在非聚集非唯一索引中索引空值?

  3. 3

    为什么在SQL Server中每个表只能创建一个聚集索引?

  4. 4

    SQL Server:创建非聚集索引而不给其命名

  5. 5

    SQL查询可在同一列上实现多个WHERE条件

  6. 6

    如何获取在SQL Server的另一列上具有多个值的行?

  7. 7

    在同一列上具有2个INNER JOIN的SQL不起作用

  8. 8

    在SQL Server中,多列非聚集索引中的列顺序是否重要?

  9. 9

    在同一列SQL中创建对数值

  10. 10

    SQL Multiple在同一列上选择

  11. 11

    索引视图上的SQL Server列存储聚集索引

  12. 12

    SQL Server索引-在组合键字段上创建非聚集索引有什么好处?

  13. 13

    SQL Server:合并(插入/更新)后的非聚集索引

  14. 14

    如何在SQL的同一列上创建多个条件

  15. 15

    SQL Server:聚集索引比等效的非聚集索引慢得多

  16. 16

    同一列上有多个SQL过滤器

  17. 17

    SQL查询一列上的多列DISTINCT

  18. 18

    具有多列的SQL Server非聚集索引

  19. 19

    SQL Server:在一列上有多个选择语句

  20. 20

    当在同一列上定义主键时,仍需要SQL Server索引吗?

  21. 21

    索引视图上的SQL Server列存储聚集索引

  22. 22

    非唯一列上的SQL Server聚集索引

  23. 23

    具有多个事件的DateDiff同一列SQL Server

  24. 24

    在多表SQL中选择同一列的非重复

  25. 25

    嵌套在一列上的 Sql 比较

  26. 26

    SQL Server 非聚集索引 - 包括值

  27. 27

    同一个表的列上的 SQL 连接与另一列上的 MAX

  28. 28

    sql server 如何在复合非聚集索引中查找?

  29. 29

    SQL 来自同一列的上一行

热门标签

归档