SQL语句优化分享——索引概要.ppt
文本预览下载声明
为什麽非聚集索引才会出现书签查找??? 大家可以再看一下非聚集索引的结构图和MSDN的定义 MSDN定义:当查询优化器使用非聚集索引进行查找时,如果所选择的列或查询条件中的列只部分包含在使用的非聚集索引和聚集索引中时,就需要一个查找(lookup)来检索其他字段来满足请求。对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup),这种查找即是——书签查找(bookmark lookup)。简单的说就是当你使用的sql查询条件和select返回的列没有完全包含在索引列中时就会发生书签查找 因为无论是(1)只有非聚集索引的表 还是(2)聚集索引和非聚集索引并存的表 数据页都不是非聚集索引的一部分 所以如果所查找的数据不在非聚集索引的索引页就需要到数据页去取数据,这种情况就叫“书签查找” 其实数据表里的数据就像书本里的内容,而非聚集索引就像书签,因为书本里的内容不可能全部在书签里,但是要找到书本里的内容需要书签去定位 * * * * * 大家可以看到执行计划里面索引扫描的开销是94% ,键查找的开销是0% 因为SQLSERVER要扫描每一个非聚集索引页,当找到GroupName=销售组168的那条记录的时候,自然就知道DepartmentID的值 然后根据[DepartmentID]的值去聚集索引页里找记录,但是聚集索引页里的每行记录只记录了聚集索引键(DepartmentID)的范围值 那怎么找呢? * 刚才说到:然后根据[DepartmentID]的值去聚集索引页里找记录,但是聚集索引页里的每行记录只记录了聚集索引键(DepartmentID)的范围值 那怎么找呢? 答案是匹配查找,SQLSERVER需要在聚集索引页里找到168究竟在哪个范围之内,逐个匹配,当匹配到108~209这个范围之后 就到16488的数据页里找数据,把[ModifiedDate]的值读出来. * 因为要用到匹配查找,所以这里会有嵌套循环inner join 因为这里只需要在每个非聚集索引页里逐行记录逐行记录扫描,而不需要在聚集索引页里逐行记录去查找(就是说聚集索引什么动作都不用做, 等非聚集索引把GroupName=销售组168那条记录读出来把DepartmentID也读出来然后与聚集索引页里的记录逐个匹配就可以了) 所以开销是0% * * * * * * * * 键锁应该是当SQLSERVER找到那条记录之后,需要在索引页指向数据页的那一行加上一个键锁,以防止别人这行记录。 KEYHASHVALUE的意思:索引键(KEY)+HASHVALUE(散列出来的值) * * 由于非聚集索引上一般只会有一小部分字段,所以这里虽然也是扫描,但是代价会比整表扫描要小很多。 * * * * * IndexID???索引ID:?0 代表堆, 1 代表聚集索引, 2-250 代表非聚集索引 ,大于250就是text或image字段 PageType? 页类型: 1:数据页面;2:索引页面;3:Lob_mixed_page;4:Lob_tree_page;10:IAM页面 IndexLevel 索引级别:0表示叶子节点,根节点的级别最高 NextPagePID 同一级下一页ID PrevPagePID 同一级上一页ID * 聚集索引跟非聚集索引不同,聚集索引页里的一行表示一个数据页,而且标记了这个数据页索引字段的范围值。 而非聚集索引跟数据表的记录一一对应,非聚集索引页里的一行记录表示数据表的一行记录,而且记录了指向实际记录的指针。 其实非聚集索引的所有索引页合并在一起就是数据表的一个缩小版(表中只有非聚集索引),索引页中只包含创建非聚集索引时的字段, 所以当数据量少的时候,会使用全表扫描而不用索引扫描,因为堆中的数据页包含了表的全部字段 而索引页只包含了索引的字段,当select的时候,无论你是select * 还是select 某个字段 ,在效率上会差不多但是可以select出来的数据就会多很多。 * * * * * * * * * * * * * /zh-cn/library/ms190806(SQL.90).aspx 聚集索引扫描扫描的是数据页,而非聚集索引扫描扫描的是索引页 如果聚集索引扫描的是数据页,那么就算你把覆盖索引加到聚集索引的索引页也没有用,因为使用聚集索引扫描的时候扫描的是数据页而不像非聚集索引那样扫描的是索引页 * * * * * MSDN中的解释:/zh-cn/library/ms177484(v=SQL.105).aspx 根据MSDN的解释,实际上相当于在非聚集索引上建立多一个字段,而这个字段就是联系聚集索引和非聚集索引的桥梁 * 那么当要查询的字段不在非聚集索引的索
显示全部