繁体   English   中英

在运行大量插入的同时选择百万条以上的记录

[英]Select million+ records while huge insert is running

我正在尝试从单个表中提取应用程序日志文件。 选择查询语句非常简单。

select top 200000 * 
from dbo.transactionlog 
where rowid>7 
and rowid <700000 and 
Project='AmWINS' 

以上选择的查询时间超过5分钟。 它长吗? 在运行select的同时,批量插入也在运行。

[编辑]

实际上,我当前的生产日志数据库存在严重问题,基本上,我们只有一个表(transactionlog)。 所有应用程序日志将插入到此表中。 对于像AmWINS这样的项目,基于选择计数结果,我们每天大约插入800K ++条记录。 记录的插入每天在生产环境中运行24小时。 如果用户要检查事务日志,则希望从表中提取数据。 因此,如果需要,我们需要从表中选择记录。

我试图模拟UAT环境,以根据Production抽取大量数据,到今天,该产量已经增长到1000万条记录。 当我尝试提取记录时,同时,我使用批量插入进行模拟,使其看起来像在生产环境中一样。 仅花费了5分钟即可提取20万条记录。

在提取运行期间,我监视SQL phyiscal服务器上的CPU峰值达到95%。

该表具有13个字段,并使用bigint标识打开(行)。 rowid是PK。 在日期,项目,模块和RefNumber上创建索引。 在行锁和启用页面锁的情况下创建表。 我正在使用SQL Server 2005。

希望你们能给我一些专业的建议,以启发我。 谢谢。

您可能可以使用“ Nolock”表提示,如下所述:

表提示MSDN

您的SQL将变成这样:

select top 200000 * from dbo.transactionlog with (no lock) ...

如果您不关心返回的数据的完整准确性,则可以实现更好的性能。

您要处理200,000行吗? 您正在通过网络运行此程序吗? 根据表的宽度,仅花费整个网络上的数据量可能是大部分时间。

您也可以将其导出为本地dat或sql文件。

这取决于您的硬件。 在插入数据的同时拉出200000行需要一些严肃的IO,因此除非您拥有30多个磁盘系统,否则它将很慢。

另外,您的rowID列是否已索引? 这将有助于选择,但可能会降低批量插入的速度。

我不确定,但是不批量插入MS SQL会锁定整个表吗?

正如ck所说。 索引很重要。 因此,请确保您已准备好适当的索引。 我不仅会在rowId上设置索引,还会在Project上设置索引。 我还要将条款重写为:

WHERE Project = 'AmWINS' AND rowid BETWEEN 8 AND 699999

原因:我猜想Project比rowid更具限制性,并且-如果我错了,请纠正我-BETWEEN比<和>比较要快。

没有索引的数量会在这里有所帮助,因为它是一个SELECT *查询,因此很可能是PK扫描或可怕的预订查询

而TOP是没有意义的,因为没有ORDER BY。

据我所知,同时插入可能会引起误解,除非该表只有2列,并且大容量插入会锁定整个表。 使用简单的int IDENTITY列,插入和选择也可能不会互相干扰。

特别是如果批量插入只有几千行(甚至10,000行)

编辑。 TOP和rowid值并不表示一百万以上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM