数码资讯
解决书签查询的SQL查询性能优化
首先看看什么是书签查找: 当优化器选择的非聚集索引只包含查询请求的一部分时,需要查找(查找)来检索其他字段以满足请求。 书签根据索引查找行表中的数据。因此,除了索引页的逻辑读取之外,还需要对数据页进行逻辑读取。 通过索引行定位器从表中读取数据,额外的开销解决了这个开销。 首先看看我的测试表结构: 可
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
首先看看什么是书签查找:
当优化器选择的非聚集索引只包含查询请求的一部分时,需要查找(查找)来检索其他字段以满足请求。
书签根据索引查找行表中的数据。因此,除了索引页的逻辑读取之外,还需要对数据页进行逻辑读取。
通过索引行定位器从表中读取数据,额外的开销解决了这个开销。
首先看看我的测试表结构:
可以看出,有一个聚簇索引和非聚簇索引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
好吧,写这么多。
当优化器选择的非聚集索引只包含查询请求的一部分时,需要查找(查找)来检索其他字段以满足请求。
书签根据索引查找行表中的数据。因此,除了索引页的逻辑读取之外,还需要对数据页进行逻辑读取。
通过索引行定位器从表中读取数据,额外的开销解决了这个开销。
首先看看我的测试表结构:
可以看出,有一个聚簇索引和非聚簇索引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
好吧,写这么多。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。