在大插入运行时选择百万+记录

时间:2009-05-22 08:39:06

标签: sql sql-server select concurrency

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

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

上述选择的查询时间超过5分钟。它被认为是长的吗?当select正在运行时,批量插入也在运行。

[编辑]

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

我试图在UAT环境中进行模拟,按照生产计算,直到今天已经增长到1000万条记录。当我尝试提取记录的同时,我使用批量插入进行模拟,使其看起来像生产环境。花了5分钟才拿出200k的记录。

在提取运行期间,我监视SQL物理服务器CPU的峰值高达95%。

这些表有13个字段,并且使用bigint打开身份(rowid)。 rowid是PK。 索引是在Date,Project,module和RefNumber上创建的。 这些表是在rowlock和pagelock上启用的。 我正在使用SQL Server 2005。

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

7 个答案:

答案 0 :(得分:2)

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

Table Hints MSDN

你的SQL会变成这样:

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

如果您不担心返回数据的完整准确性,这将获得更好的性能。

答案 1 :(得分:1)

你在200,000行做什么?你是通过网络运行吗?根据表格的宽度,只需花费大量的时间在网络上获取数据量。

答案 2 :(得分:0)

这取决于您的硬件。在插入数据时拔出200000行需要一些严重的IO,所以除非你有30 +磁盘系统,否则它会很慢。

此外,您的rowID列是否已编入索引?这将有助于选择,但可能会减慢批量插入。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

正如ck已经说过的那样。索引很重要。因此,请确保准备好适当的索引。我不仅会在rowId上设置索引,还会在Project上设置索引。我也会将where子句重写为:

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

原因:我猜Project比rowid更具限制性 - 纠正我,如果我错了 - BETWEEN比&lt;和&gt;比较。

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

没有多少索引在这里会有所帮助,因为它是一个SELECT *查询所以它很可能是PK扫描或可怕的书面查找

TOP没有意义,因为没有ORDER BY。

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

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

编辑。 TOP和rowid值并不意味着百万加