学习是件开心事

sqlserver中include的魅力

优化慢sql的时候,ssms经常会建议添加include的索引,那么include和复合索引究竟有啥区别呢

  • 【复合索引】
    和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引

  • 【索引覆盖】
    如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再根据聚集索引来查找数据行

  • 【非键列】
    键列就是在索引中所包含的列,当然非键列就是该索引之外的列了

复合索引和include索引都实现了索引覆盖,无需二次lookup查找数据行。但是维护索引是有开销的,数据的变动会造成索引的更改和排序。如果使用include的话,非键列将数据添加到最低叶级别,而不是索引树中,这使得索引更小,因为它不是树的一部分。并且不会做排序操作。