sql-server – 从索引列上的一个非常大的表中选择TOP 1非常慢,但不是反向顺序(“desc”)

我们有一个大型数据库,大约1TB,在功能强大的服务器上运行SQL Server 2014.几年来一切正常.大约2周前,我们进行了全面维护,其中包括:安装所有软件更新;重建所有索引和压缩DB文件.但是,我们没想到在实际负载相同的情况下,DB的CPU使用率会在某个阶段增加100%以上至150%.

经过大量的故障排除后,我们将其缩小到一个非常简单的查询,但我们找不到解决方案.查询非常简单:

select top 1 EventID from EventLog with (nolock) order by EventID

它总是需要大约1.5秒!但是,使用“desc”的类似查询总是需要大约0毫秒:

select top 1 EventID from EventLog with (nolock) order by EventID desc

PTable有大约5亿行; EventID是主要聚簇索引列(有序ASC),数据类型为bigint(标识列).有多个线程将数据插入到顶部的表中(较大的EventID),并且有1个线程从底部删除数据(较小的EventID).

在SMSS中,我们验证了两个查询始终使用相同的执行计划:

>聚簇索引扫描;
>估计的和实际的行数都是1;
>估计和实际执行次数均为1;
>估计I / O成本是8500(似乎很高)
>如果连续运行,则两者的查询成本相同,为50%.

我用fullscan更新了索引统计信息,问题仍然存在;我再次重建了索引,问题似乎已经消失了半天,但又回来了.

我打开了IO统计信息:

set statistics io on

然后连续运行两个查询并找到以下信息:

(对于第一个查询,慢一个)

Table ‘PTable’. Scan count 1,logical reads 407670,physical reads 0,read-ahead reads 0,lob logical reads 0,lob physical reads 0,lob read-ahead reads 0.

(对于第二个查询,快速查询)

Table ‘PTable’. Scan count 1,logical reads 4,lob read-ahead reads 0.

请注意逻辑读取的巨大差异.该指数用于两种情况.

索引碎片可以解释一下,但我相信影响非常小;而这个问题从未发生过.另一个证据是,如果我运行如下查询:

select * from EventLog with (nolock) where EventID=xxxx

即使我将xxxx设置为表中最小的EventID,查询也总是闪电般快速.

我们检查过,没有锁定/阻塞问题.

注意:我只是试图简化上面的问题. “PTable”实际上是“EventLog”; PID是EventID.

没有NOLOCK提示我得到相同的结果测试.

有人可以帮忙吗?

XML中更详细的查询执行计划如下:

https://www.brentozar.com/pastetheplan/?id=SJ3eiVnob

https://www.brentozar.com/pastetheplan/?id=r1rOjVhoZ

我认为提供create table语句并不重要.它是一个旧的数据库,并且在维护之前已经运行了很长时间.我们自己做了很多研究,并将其缩小到我的问题中提供的信息.

该表通常以EventID列作为主键创建,该键是bigint类型的标识列.这时,我猜问题是索引碎片问题.在索引重建之后,问题似乎已经消失了半天;但为什么它回来这么快……?

解决方法

聚集索引扫描显示423,723个逻辑读取返回第一行,耗时1926毫秒:

在索引顺序中找到第一行似乎相当多.

很可能你的幽灵清理任务已经落后很长时间,或者已经停止了.您应该在sys.dm_db_index_physical_stats中检查聚集索引的ghost_record_count,并监视一段时间内的更改.

从索引末尾看到的持续删除活动的有序扫描必须扫描大量的幻影记录,然后才能找到要返回的第一个“活动”行.这解释了额外的逻辑读取.向下搜索b树到索引的最低值将会遇到更少的幻影记录.

另一个影响性能的因素是扫描本身负责删除由Paul Randal在Inside the Storage Engine: Ghost cleanup in depth中提到的重影记录.

您应该检查跟踪标志661(禁用重影清理)是否处于活动状态.

解决方案

>您可能会发现运行sp_clean_db_free_space可以减轻负担.
>更改从索引末尾删除行的进程以使用PAGLOCK提示would enable ghost cleanup on the spot,这也可以很好地解决问题.

如果ghost清理进程已完全停止,则最有效的解决方案通常是重新启动SQL Server实例.您还应确保SQL Server正在运行最新的累积更新之一.多年来,有许多鬼清理漏洞.

在您的具体情况:

It turned out the problem was caused by another test database on the same server. That test database was restored with “data loss”,and is corrupt. Surprisingly,the ghost cleanup process apparently was stuck in that database. Once we deleted that corrupted database from SMSS,the problem resolved by itself (took a long time and might have caused DB to lockup for a short while).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( 'table_name' [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: 'No Process is on the Other End of the Pipe'。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:
对于指定的缓冲区大小而言,源列的数据太大