首先看看什么是书签查找:

当优化器选择的非聚集索引只包含查询请求的一部分时,需要查找(查找)来检索其他字段以满足请求。

书签根据索引查找行表中的数据。因此,除了索引页的逻辑读取之外,还需要对数据页进行逻辑读取。

通过索引行定位器从表中读取数据,额外的开销解决了这个开销。

首先看看我的测试表结构:
可以看出,有一个聚簇索引和非聚簇索引ix_username pk_userid。

查看书签查找的效果:

选择用户名,从dbo.userinfo么= 'usern600性别

根据上面的SQL生产执行计划,您可以看到一个书签查找(键查找),如下所示


如果上面的SQL被重写了

选择从哪里'usern600 dbo.userinfo用户名为用户名

您可以看到书签查找丢失了。

此SQL生成书签的主要原因是SQL优化器将选择非聚集索引ix_username为SQL的诞生,ix_username索引不包含性别领域,从指数,数据表,生成一个查询,一个书签查找。
解决书签查找:

方法1。使用群集索引

对于聚集索引,索引叶页和表数据页是相同的。因此,当读取聚集索引键列的值时,数据引擎可以读取任何列值而不需要任何行位置,从而解决书签查找。
对于SQL(选择用户名,性别dbo.userinfo么= 'usern600)解决书签查找方法是建立在用户聚类指标,作为一个表有一个聚集索引,这意味着要删除现有的聚集索引(pk_userid),会导致其它从表的外键约束发生变化,需要采取一些相关的工作,可能会严重影响其他查询的依赖于现有的聚集索引。

方法二。使用覆盖索引

覆盖索引是一个非聚集索引,它是为满足不必到达基表的SQL查询的所有列构建的索引。如果查询满足索引,不需要完全引用底层数据表,则索引可以被认为是一个覆盖索引。
此SQL(选择用户名,性别dbo.userinfo么= 'usern600),以解决书签查找的方法是:在非聚集索引ix_username性别领域。
也就是说,在构建索引时使用包含语句,具体操作如下所示
在下列情况下最好使用:
1,你不想增加索引键的大小,但是你仍然可以构建一个覆盖索引。
2,我们打算指标数据类型不能被索引(除了文本、ntext和图像);
三.超过索引的关键字列的最大数目。

方法三。使用索引连接

索引连接是使用多个索引之间的索引交叉的查询的完整覆盖。如果覆盖索引非常宽,则可以考虑索引连接。
此SQL(选择用户名,性别dbo.userinfo么= 'usern600'and性别= 1),我们可以建立一个聚集索引的性别。
在这个例子中,它是可能的,SQL优化器不会选择非聚集索引ix_username同时和我们新建的指数对性别。这时,我们可以告诉SQL优化器同时使用这两个索引。
性别选择,从UserInfo的用户名(指数(ix_gender,ix_username)),用户名为'jins'and

好吧,写这么多。