数码资讯
基于书签查找的SQLServer查询性能优化
小程序的增长 1、毕业或不工作很长时间后,我只知道有数据库和SQL等数据库。我不能清楚地说明SQL和SQLServer Oracle和MySQL之间的关系。一般来说,sql是sql server。 2。工作了几年,也写了很多的SQL,但不知道什么是索引,索引数据库只知道这样一件事,不能区分聚集和非聚
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
小程序的增长
1、毕业或不工作很长时间后,我只知道有数据库和SQL等数据库。我不能清楚地说明SQL和SQLServer Oracle和MySQL之间的关系。一般来说,sql是sql server。
2。工作了几年,也写了很多的SQL,但不知道什么是索引,索引数据库只知道这样一件事,不能区分聚集和非聚集,只知道慢查询的索引查询快,最后指数也建了很多,查询也很快,偶尔会问:你为什么开发的指数型回答:…
三.最后刺激开始努力买书,查资料,GG终于知道索引分为聚集和非聚集,突然大哭起来,唉,我终于知道什么是索引。
4。进一步学习,我们也知道聚集索引是物理索引,非聚集索引是逻辑索引,聚集索引是数据存储顺序。非聚集索引是逻辑索引和聚集索引的索引。
5。然后学会查看执行计划,通过查询计划最后查询过程有了大概了解,也知道了聚集索引扫描和扫描表的索引是不习惯,看到聚集索引,看到摆脱索引搜索,找到关键眉开眼笑,暗自窃喜,看,肯定是关键的搜索关键词搜索,使用的指标,效率要高,所以每个完成的SQL执行计划表表扫描所有如果我不干散货,搜索,搜索的关键。
6。悠闲的一天,充满自信,有一天突然感到困惑,为什么我在这个领域上建立了索引,这是她姐姐的旧给我一个聚集索引扫描,查询优化器不发烧,实际执行中,发现实际执行计划也是一个表扫描,这个完全迷惑,也许是查询优化器显示。
7。进一步研究发现,数据库中这种水太深,太片面的理解,思考从猿到人的进化过程。嗯,现在是一个聪明的开放程序猿,向着伟大的程序员奋进。
我离题了,进入我们的主题:数据库搜索书签
了解书签查找
对许多开发人员来说,书签查找词可能不知道。很多人都遇到过,但并没有引起足够的重视,以至于被忽视了。
定义:当查询优化器使用非聚集索引进行搜索时,如果所选列或查询条件中的列仅部分地包含在非聚集索引和聚集索引中,则需要查找(查找)来检索其他字段以满足请求。对于堆表,它是一个清除查找(去掉查找),称为书签查找(书签查找)。简单地说,当您使用的SQL查询条件和SELECT返回的列不完全包含在索引列中时,将出现书签查找。
书签查找的重要性
1、书签查找的条件发生:只有在使用非聚集索引进行数据查找时,才能生成书签查找。聚集索引查找、聚集索引扫描和表扫描不会使用书签查找。
2。书签查找频率:书签查找出现频率很高,甚至可以说,大部分的查询可以搜索书签,我们知道,一个表只能创建一个聚集索引,所以我们查询更会使用非聚集索引,非聚集索引不能覆盖所有的查询栏,它会产生定期搜索书签。
三.书签查找的影响:一个指标失效的主要原因。根据行定位器书签查找的索引从表中读取数据,除了逻辑索引页面读取数据页的逻辑也需要阅读,如果查询返回大量数据的结果导致大量的逻辑读或失败的指标,这就是为什么我们看到的查询计划有时明确建立索引列的查询,查询优化器使用表扫描。
4。如何消除书签查找:
1。使用聚合索引查找聚集索引的叶节点是数据行本身,因此没有书签查找。
2、聚集索引扫描和表扫描。很明显,什么索引不建立直接的全表扫描,这不会发生书签查找,而是效率。
三.使用非聚集索引键列包含所有的查询或返回列,这是不可靠的,非聚集索引的键列最大数为16,最大索引键的大小是900字节,即使您有勇气在16列中进行索引,也就是说如果表的列数超过16列就行了。和列索引的长度,不能超过900字节,因此不可能包含所有非聚集索引的列,并且与列索引维护开销相关的索引也更多。
4。使用包括,嗯,这是一件好事,只能做指数包含16列的和不能超过900字节,包括不受此限制,最多可包含1023列就足够为你,和长度没有限制你可以包括nvarchar(max)这个栏目,当然不考虑文本的喜欢
5,还有其他的神。我不知道这个。我应该知道,也许,也许是木头。如果你认识一个哥哥,你可以告诉我。
也许有点抽象,让我们来看看具体的例子。
我们在一般的数据库将建立在一个聚簇索引(不确定从ID列当主键,先增加一般有用爱建表当主键SQL Server默认会给你创造一个聚集索引),所以我们认为这里的表建立了聚集索引,而不考虑桩表面(没有聚集索引的表)
1。首先创建一个用户表,插入一些样本数据,建立一个聚集索引pk_userid非聚集索引ix_username
复制代码代码如下所示:
——懒惰的胖兔子——创建一个表用户
创建表的用户
(
国际身份,
用户名nvarchar(50),
年龄int,
性别点,
创造时间的日期
)
创建一个聚集索引pk_userid在用户名栏
创建聚集索引pk_userid用户(用户名)
在用户名创建非聚集索引ix_username
创建索引ix_username用户(用户名)
-插入示例数据
插入用户(用户名、年龄、性别、创造时间)
选择n'bob,20,1,'2012-5-1
联盟的所有
选择n'jack,23,0,'2012-5-2
联盟的所有
选择n'robert ',28,1,'2012-5-3
联盟的所有
选择n'janet.6,'2012-5-9
联盟的所有
选择n'michael,1,'2012-5-2
联盟的所有
选择n'laura,16,1,'2012-5-1
联盟的所有
选择n'anne,36,'2012-5-7
2、执行下面的查询并检查查询计划。您可以看到第一个SQL执行索引扫描,第二个SQL执行聚集索引查找,而不是用于书签查找。
复制代码代码如下所示:
从用户中选择*
从users UserID = 4
三.比较下面的查询SQL,观察它的查询计划,并考虑为什么找到书签
复制代码代码如下所示:
查询1:使用索引ix_username,选择列用户名,用户名,查询条件是用户名
选择用户名,用户名,用户(指数(ix_username)),用户名为罗伯特
查询2:使用索引ix_username,选择列用户名,用户名,年龄,查询条件是用户名
选择用户名,用户名,年龄从用户(指数(ix_username)),用户名为罗伯特
查询3:使用索引ix_username,选择列用户名,用户名,查询条件是用户名,年龄
选择用户名,用户名,用户(指数(ix_username)),用户名为'robert'and年龄= 28
-查询4:使用索引ix_username选择所有列的列,和查询条件列为用户名
SELECT * FROM用户(指数(ix_username)),用户名为罗伯特
分析:
选定的列是用户查询1:pk_userid聚集索引的键列,用户名ix_username索引键列,列为用户名查询条件,因为ix_username包含用于索引的所有列的查询,所以只需要扫描索引来返回查询结果,不需要采取额外的数据获得的数据页,所以它不会发生在搜索书签
查询2:选择柱的年龄是不包括在聚集索引pk_userid和ix_username,因此需要额外的书签查找
查询3:查询条件年龄列不列入综合指数pk_userid和ix_username,因此需要额外的书签查找
质疑4:包含所有列,年龄,性别和创造时间列没有聚集索引pk_userid和ix_username,所以书签查找定位所需的数据。
这里要说明:用于查询是否在索引范围查询开销一列基本相同的列,每个记录需要书签查找的开销,不是因为查询3只有一列的年龄,年龄,性别,查询4创造时间3列在索引覆盖由于额外的开销
分析:
选定的列是用户查询1:pk_userid聚集索引的键列,用户名ix_username索引键列,列为用户名查询条件,因为ix_username包含用于索引的所有列的查询,所以只需要扫描索引来返回查询结果,不需要采取额外的数据获得的数据页,所以它不会发生在搜索书签
查询2:选择柱的年龄是不包括在聚集索引pk_userid和ix_username,因此需要额外的书签查找
查询3:查询条件年龄列不列入综合指数pk_userid和ix_username,因此需要额外的书签查找
质疑4:包含所有列,年龄,性别和创造时间列没有聚集索引pk_userid和ix_username,所以书签查找定位所需的数据。
这里要说明:用于查询是否在索引范围查询开销一列基本相同的列,每个记录需要书签查找的开销,不是因为查询3只有一列的年龄,年龄,性别,查询4创造时间3列在索引覆盖由于额外的开销
书签查找是如何发生的
许多人喜欢看画的人二叉树索引结构是一个很大的头,看得云里雾里,所以在这里我们把表用户聚集索引的例子(pk_userid)和非聚集索引(ix_username)的结构可简单表示如下
首先我们来看看pk_userid聚集索引,数据线的叶节点的聚集索引,以便找到一个特定的实施重点聚集索引查找后叶节点可以直接获得所有需要的数据,而不需要额外的逻辑来读,如从users UserID = 2,根据价值2的指数pk_userid在2用户价值发现叶节点可以获得所需的数据,然后返回查询结果
再看看非聚集索引ix_username以上,我们所说的非聚集索引覆盖率作为一个非聚集索引的键列+包含聚集索引键列为ix_username在图用户名存储在二进制树节点的索引键列示,聚集索引包含在叶子节点,这是形成在列(用户名,用户名)1查询范围(选择用户名,用户名,用户(指数(ix_username)的地方)用户名为罗伯特)为使用用户名和用户ID列的查询,所以只需要扫描索引ix_username可以得到所有的数据,然后返回结果。但对于查询2、查询3因为需要使用年龄列,和ix_username索引不包含年龄列,那么你需要找到一个书签(书签查找),根据在叶节点的ROWID获得年龄的列的值的具体位置数据,根据行罗伯特ix_username位置索引,例如查询,然后根据rowid = 3数据表获得的年龄值,进而完成查询,4列的查询(年龄,性别,创造时间),到Robert RowID = 3相同的位置。得到一个一次性的数据表的年龄、性别、创造时间的数据,然后返回,从而形成一个书签查找(显示键查找或排除搜索查询计划)
书签查找对查询性能的影响
这是该指数创建索引ix_username用户(用户名)我们现在所用的
打开IO统计信息并执行以下两个查询
复制代码代码如下所示:
——SETSTATISTICSIO onselect *用户的用户名like'ja % 'select用户*
两个查询返回2条数据,聚集索引扫描只有2逻辑读,和指数ix_username已经达到6的逻辑解读。
我们的样本数据量比较小,所以感觉不明显,但我们也可以看到我们的上市ix_username用户名默认索引,查询优化器不使用我们的指标,而是一个选择表扫描,只有2个逻辑读得到我们需要的数据,当我们使用的指标强制查询优化器使用索引ix_username,也回到2的数据,逻辑读短达到了惊人的6次,查看查询计划书签搜索使用后ix_username,这个开销主要由书签查找造成的,与我们返回数据量的增加,造成的书签查找将逻辑读起来,结果是,查询成本比全表扫描,最终导致失败指数的盟友
使用覆盖索引避免书签查找
覆盖索引是非聚集索引(键列+包含列)中的列+聚集索引的键列包含查询中使用的所有列。ix_username指数,指数覆盖柱(用户名,用户名)。如果使用索引覆盖查询,然后只需扫描索引来完成查询,如果外面的指数覆盖的使用将需要找到一个书签栏来获取数据,当查找发生时有指标将导致导致表扫描失败,因为查询优化器是一个基于成本的优化,当它发现使用非聚集索引书签查找开销造成大于表扫描的开销会放弃一个表扫描索引的使用。
1,重建对用户名和年龄指标ix_username柱。指数ix_username,覆盖列变化(用户名、年龄、用户标识)。再次执行上面的查询SQL,我们可以看到查询计划已经改变。
复制代码代码如下所示:
对用户userscreate指数ix_username下降指数ix_username(用户名、年龄)
我们可以看到查询2、查询3书签查找已经消失了,因为指数ix_username包含用于所有列的查询(用户ID、用户名、年龄),因为查询4返回我们的索引的所有列的选择不包含性别和创造时间列,它仍然会发现书签
此时的指数ix_username结构表示如下
查询2,只有3的指标ix_username查询可以得到用户名,需要年龄,用户名,和4的查询索引没有覆盖所有仍需要继续修改2。书签查找索引ix_username我们使用包括,包含非键列(叶节点以外的键列上的索引列,非键列的索引,包括存储在列中,在非聚集索引的叶节点的柱也把聚集索引,非聚集索引)
复制代码代码如下所示:
对用户userscreate指数ix_username下降指数ix_username(用户名、年龄)包括
可以看出,我们修改了索引。在使用包括,包含性别、创造时间,指数ix_username达到所有列的数据表的用户全覆盖。当时,毫无疑问,查询2和查询3没有出现书签查找,查询4的书签查找也消失了。
在这一点上的指数ix_username结构如下
指数ix_username已达到用户表的全覆盖。我们的查询2、查询3、查询4,我们只能通过指数ix_username完成查询,而不需要书签查找。
现在让我们来看一下这两个查询的开销和查询计划。我们可以看到我们不需要索引提示。查询优化器自动地选择了我们的索引,逻辑读取也下降到2次。
从users用户名like'ja % 'select *从用户(指数(ix_username))
要包含,请参阅SQL Server索引中包含的魅力(包含列的索引)
这里的书签查找查询性能有很大的影响,基本上是不可避免的,这并不意味着书签查找是洪水猛兽,我们不知道什么是不一样的书签查找,查询性能不好,嗯,嗯。书签查找也解释了为什么我们不推荐使用选择写SQL,也解释了为什么我们的指数有时会失败,可作为查询优化性能的考虑,在表和索引的设计尽可能避免书签查找带来的负面效应,如非聚集索引的列选择回报高选择性的尽可能小,需要大批量数据查询使用聚集索引等。 U3000 U3000
在本文中,为了方便演示只使用几个数据表,查询要使用索引和索引提示发展实际,请不要使用索引提示,在大多数情况下,查询优化器将生成最优的(我们不代表最优成本小,如只要成本足够小,最佳的执行)的计划,它使用ROWID索引结构只是为了展示想象的,只要我们认为它是一个位在线数据线。
本文的目的是让我们了解书签查找,了解书签查找的意义,以便我们对索引失败的原因有一个清晰的了解,更好地理解查询计划。
1、毕业或不工作很长时间后,我只知道有数据库和SQL等数据库。我不能清楚地说明SQL和SQLServer Oracle和MySQL之间的关系。一般来说,sql是sql server。
2。工作了几年,也写了很多的SQL,但不知道什么是索引,索引数据库只知道这样一件事,不能区分聚集和非聚集,只知道慢查询的索引查询快,最后指数也建了很多,查询也很快,偶尔会问:你为什么开发的指数型回答:…
三.最后刺激开始努力买书,查资料,GG终于知道索引分为聚集和非聚集,突然大哭起来,唉,我终于知道什么是索引。
4。进一步学习,我们也知道聚集索引是物理索引,非聚集索引是逻辑索引,聚集索引是数据存储顺序。非聚集索引是逻辑索引和聚集索引的索引。
5。然后学会查看执行计划,通过查询计划最后查询过程有了大概了解,也知道了聚集索引扫描和扫描表的索引是不习惯,看到聚集索引,看到摆脱索引搜索,找到关键眉开眼笑,暗自窃喜,看,肯定是关键的搜索关键词搜索,使用的指标,效率要高,所以每个完成的SQL执行计划表表扫描所有如果我不干散货,搜索,搜索的关键。
6。悠闲的一天,充满自信,有一天突然感到困惑,为什么我在这个领域上建立了索引,这是她姐姐的旧给我一个聚集索引扫描,查询优化器不发烧,实际执行中,发现实际执行计划也是一个表扫描,这个完全迷惑,也许是查询优化器显示。
7。进一步研究发现,数据库中这种水太深,太片面的理解,思考从猿到人的进化过程。嗯,现在是一个聪明的开放程序猿,向着伟大的程序员奋进。
我离题了,进入我们的主题:数据库搜索书签
了解书签查找
对许多开发人员来说,书签查找词可能不知道。很多人都遇到过,但并没有引起足够的重视,以至于被忽视了。
定义:当查询优化器使用非聚集索引进行搜索时,如果所选列或查询条件中的列仅部分地包含在非聚集索引和聚集索引中,则需要查找(查找)来检索其他字段以满足请求。对于堆表,它是一个清除查找(去掉查找),称为书签查找(书签查找)。简单地说,当您使用的SQL查询条件和SELECT返回的列不完全包含在索引列中时,将出现书签查找。
书签查找的重要性
1、书签查找的条件发生:只有在使用非聚集索引进行数据查找时,才能生成书签查找。聚集索引查找、聚集索引扫描和表扫描不会使用书签查找。
2。书签查找频率:书签查找出现频率很高,甚至可以说,大部分的查询可以搜索书签,我们知道,一个表只能创建一个聚集索引,所以我们查询更会使用非聚集索引,非聚集索引不能覆盖所有的查询栏,它会产生定期搜索书签。
三.书签查找的影响:一个指标失效的主要原因。根据行定位器书签查找的索引从表中读取数据,除了逻辑索引页面读取数据页的逻辑也需要阅读,如果查询返回大量数据的结果导致大量的逻辑读或失败的指标,这就是为什么我们看到的查询计划有时明确建立索引列的查询,查询优化器使用表扫描。
4。如何消除书签查找:
1。使用聚合索引查找聚集索引的叶节点是数据行本身,因此没有书签查找。
2、聚集索引扫描和表扫描。很明显,什么索引不建立直接的全表扫描,这不会发生书签查找,而是效率。
三.使用非聚集索引键列包含所有的查询或返回列,这是不可靠的,非聚集索引的键列最大数为16,最大索引键的大小是900字节,即使您有勇气在16列中进行索引,也就是说如果表的列数超过16列就行了。和列索引的长度,不能超过900字节,因此不可能包含所有非聚集索引的列,并且与列索引维护开销相关的索引也更多。
4。使用包括,嗯,这是一件好事,只能做指数包含16列的和不能超过900字节,包括不受此限制,最多可包含1023列就足够为你,和长度没有限制你可以包括nvarchar(max)这个栏目,当然不考虑文本的喜欢
5,还有其他的神。我不知道这个。我应该知道,也许,也许是木头。如果你认识一个哥哥,你可以告诉我。
也许有点抽象,让我们来看看具体的例子。
我们在一般的数据库将建立在一个聚簇索引(不确定从ID列当主键,先增加一般有用爱建表当主键SQL Server默认会给你创造一个聚集索引),所以我们认为这里的表建立了聚集索引,而不考虑桩表面(没有聚集索引的表)
1。首先创建一个用户表,插入一些样本数据,建立一个聚集索引pk_userid非聚集索引ix_username
复制代码代码如下所示:
——懒惰的胖兔子——创建一个表用户
创建表的用户
(
国际身份,
用户名nvarchar(50),
年龄int,
性别点,
创造时间的日期
)
创建一个聚集索引pk_userid在用户名栏
创建聚集索引pk_userid用户(用户名)
在用户名创建非聚集索引ix_username
创建索引ix_username用户(用户名)
-插入示例数据
插入用户(用户名、年龄、性别、创造时间)
选择n'bob,20,1,'2012-5-1
联盟的所有
选择n'jack,23,0,'2012-5-2
联盟的所有
选择n'robert ',28,1,'2012-5-3
联盟的所有
选择n'janet.6,'2012-5-9
联盟的所有
选择n'michael,1,'2012-5-2
联盟的所有
选择n'laura,16,1,'2012-5-1
联盟的所有
选择n'anne,36,'2012-5-7
2、执行下面的查询并检查查询计划。您可以看到第一个SQL执行索引扫描,第二个SQL执行聚集索引查找,而不是用于书签查找。
复制代码代码如下所示:
从用户中选择*
从users UserID = 4
三.比较下面的查询SQL,观察它的查询计划,并考虑为什么找到书签
复制代码代码如下所示:
查询1:使用索引ix_username,选择列用户名,用户名,查询条件是用户名
选择用户名,用户名,用户(指数(ix_username)),用户名为罗伯特
查询2:使用索引ix_username,选择列用户名,用户名,年龄,查询条件是用户名
选择用户名,用户名,年龄从用户(指数(ix_username)),用户名为罗伯特
查询3:使用索引ix_username,选择列用户名,用户名,查询条件是用户名,年龄
选择用户名,用户名,用户(指数(ix_username)),用户名为'robert'and年龄= 28
-查询4:使用索引ix_username选择所有列的列,和查询条件列为用户名
SELECT * FROM用户(指数(ix_username)),用户名为罗伯特
分析:
选定的列是用户查询1:pk_userid聚集索引的键列,用户名ix_username索引键列,列为用户名查询条件,因为ix_username包含用于索引的所有列的查询,所以只需要扫描索引来返回查询结果,不需要采取额外的数据获得的数据页,所以它不会发生在搜索书签
查询2:选择柱的年龄是不包括在聚集索引pk_userid和ix_username,因此需要额外的书签查找
查询3:查询条件年龄列不列入综合指数pk_userid和ix_username,因此需要额外的书签查找
质疑4:包含所有列,年龄,性别和创造时间列没有聚集索引pk_userid和ix_username,所以书签查找定位所需的数据。
这里要说明:用于查询是否在索引范围查询开销一列基本相同的列,每个记录需要书签查找的开销,不是因为查询3只有一列的年龄,年龄,性别,查询4创造时间3列在索引覆盖由于额外的开销
分析:
选定的列是用户查询1:pk_userid聚集索引的键列,用户名ix_username索引键列,列为用户名查询条件,因为ix_username包含用于索引的所有列的查询,所以只需要扫描索引来返回查询结果,不需要采取额外的数据获得的数据页,所以它不会发生在搜索书签
查询2:选择柱的年龄是不包括在聚集索引pk_userid和ix_username,因此需要额外的书签查找
查询3:查询条件年龄列不列入综合指数pk_userid和ix_username,因此需要额外的书签查找
质疑4:包含所有列,年龄,性别和创造时间列没有聚集索引pk_userid和ix_username,所以书签查找定位所需的数据。
这里要说明:用于查询是否在索引范围查询开销一列基本相同的列,每个记录需要书签查找的开销,不是因为查询3只有一列的年龄,年龄,性别,查询4创造时间3列在索引覆盖由于额外的开销
书签查找是如何发生的
许多人喜欢看画的人二叉树索引结构是一个很大的头,看得云里雾里,所以在这里我们把表用户聚集索引的例子(pk_userid)和非聚集索引(ix_username)的结构可简单表示如下
首先我们来看看pk_userid聚集索引,数据线的叶节点的聚集索引,以便找到一个特定的实施重点聚集索引查找后叶节点可以直接获得所有需要的数据,而不需要额外的逻辑来读,如从users UserID = 2,根据价值2的指数pk_userid在2用户价值发现叶节点可以获得所需的数据,然后返回查询结果
再看看非聚集索引ix_username以上,我们所说的非聚集索引覆盖率作为一个非聚集索引的键列+包含聚集索引键列为ix_username在图用户名存储在二进制树节点的索引键列示,聚集索引包含在叶子节点,这是形成在列(用户名,用户名)1查询范围(选择用户名,用户名,用户(指数(ix_username)的地方)用户名为罗伯特)为使用用户名和用户ID列的查询,所以只需要扫描索引ix_username可以得到所有的数据,然后返回结果。但对于查询2、查询3因为需要使用年龄列,和ix_username索引不包含年龄列,那么你需要找到一个书签(书签查找),根据在叶节点的ROWID获得年龄的列的值的具体位置数据,根据行罗伯特ix_username位置索引,例如查询,然后根据rowid = 3数据表获得的年龄值,进而完成查询,4列的查询(年龄,性别,创造时间),到Robert RowID = 3相同的位置。得到一个一次性的数据表的年龄、性别、创造时间的数据,然后返回,从而形成一个书签查找(显示键查找或排除搜索查询计划)
书签查找对查询性能的影响
这是该指数创建索引ix_username用户(用户名)我们现在所用的
打开IO统计信息并执行以下两个查询
复制代码代码如下所示:
——SETSTATISTICSIO onselect *用户的用户名like'ja % 'select用户*
两个查询返回2条数据,聚集索引扫描只有2逻辑读,和指数ix_username已经达到6的逻辑解读。
我们的样本数据量比较小,所以感觉不明显,但我们也可以看到我们的上市ix_username用户名默认索引,查询优化器不使用我们的指标,而是一个选择表扫描,只有2个逻辑读得到我们需要的数据,当我们使用的指标强制查询优化器使用索引ix_username,也回到2的数据,逻辑读短达到了惊人的6次,查看查询计划书签搜索使用后ix_username,这个开销主要由书签查找造成的,与我们返回数据量的增加,造成的书签查找将逻辑读起来,结果是,查询成本比全表扫描,最终导致失败指数的盟友
使用覆盖索引避免书签查找
覆盖索引是非聚集索引(键列+包含列)中的列+聚集索引的键列包含查询中使用的所有列。ix_username指数,指数覆盖柱(用户名,用户名)。如果使用索引覆盖查询,然后只需扫描索引来完成查询,如果外面的指数覆盖的使用将需要找到一个书签栏来获取数据,当查找发生时有指标将导致导致表扫描失败,因为查询优化器是一个基于成本的优化,当它发现使用非聚集索引书签查找开销造成大于表扫描的开销会放弃一个表扫描索引的使用。
1,重建对用户名和年龄指标ix_username柱。指数ix_username,覆盖列变化(用户名、年龄、用户标识)。再次执行上面的查询SQL,我们可以看到查询计划已经改变。
复制代码代码如下所示:
对用户userscreate指数ix_username下降指数ix_username(用户名、年龄)
我们可以看到查询2、查询3书签查找已经消失了,因为指数ix_username包含用于所有列的查询(用户ID、用户名、年龄),因为查询4返回我们的索引的所有列的选择不包含性别和创造时间列,它仍然会发现书签
此时的指数ix_username结构表示如下
查询2,只有3的指标ix_username查询可以得到用户名,需要年龄,用户名,和4的查询索引没有覆盖所有仍需要继续修改2。书签查找索引ix_username我们使用包括,包含非键列(叶节点以外的键列上的索引列,非键列的索引,包括存储在列中,在非聚集索引的叶节点的柱也把聚集索引,非聚集索引)
复制代码代码如下所示:
对用户userscreate指数ix_username下降指数ix_username(用户名、年龄)包括
可以看出,我们修改了索引。在使用包括,包含性别、创造时间,指数ix_username达到所有列的数据表的用户全覆盖。当时,毫无疑问,查询2和查询3没有出现书签查找,查询4的书签查找也消失了。
在这一点上的指数ix_username结构如下
指数ix_username已达到用户表的全覆盖。我们的查询2、查询3、查询4,我们只能通过指数ix_username完成查询,而不需要书签查找。
现在让我们来看一下这两个查询的开销和查询计划。我们可以看到我们不需要索引提示。查询优化器自动地选择了我们的索引,逻辑读取也下降到2次。
从users用户名like'ja % 'select *从用户(指数(ix_username))
要包含,请参阅SQL Server索引中包含的魅力(包含列的索引)
这里的书签查找查询性能有很大的影响,基本上是不可避免的,这并不意味着书签查找是洪水猛兽,我们不知道什么是不一样的书签查找,查询性能不好,嗯,嗯。书签查找也解释了为什么我们不推荐使用选择写SQL,也解释了为什么我们的指数有时会失败,可作为查询优化性能的考虑,在表和索引的设计尽可能避免书签查找带来的负面效应,如非聚集索引的列选择回报高选择性的尽可能小,需要大批量数据查询使用聚集索引等。 U3000 U3000
在本文中,为了方便演示只使用几个数据表,查询要使用索引和索引提示发展实际,请不要使用索引提示,在大多数情况下,查询优化器将生成最优的(我们不代表最优成本小,如只要成本足够小,最佳的执行)的计划,它使用ROWID索引结构只是为了展示想象的,只要我们认为它是一个位在线数据线。
本文的目的是让我们了解书签查找,了解书签查找的意义,以便我们对索引失败的原因有一个清晰的了解,更好地理解查询计划。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。