我正在尝试从单个表中提取应用程序日志文件。选择查询语句非常简单。
select top 200000 *
from dbo.transactionlog
where rowid>7
and rowid <700000 and
Project='AmWINS'
以上选择的查询时间超过5分钟。它长吗?在运行select的同时,批量插入也在运行。
[编辑]
实际上,我当前的生产日志数据库存在严重问题,
基本上,我们只有一个表(transactionlog)。所有应用程序日志都将插入到此表中。对于像AmWINS这样的项目,基于选择计数结果,我们每天大约插入800K ++条记录。记录的插入每天在生产环境中运行24小时。如果用户要检查事务日志,则希望从表中提取数据。因此,如果需要,我们需要从表中选择记录。
我试图模拟UAT环境,以根据Production来抽取大量数据,到目前为止,Production已经增长了1000万条记录。当我尝试提取记录时,同时,我通过批量插入进行模拟,使其看起来像在生产环境中一样。仅花费了5分钟,即可提取20万条记录。
在提取运行期间,我监视SQL phyiscal服务器上的CPU峰值飙升到95%。
该表具有13个字段,并且具有bigint的标识打开(行)。 rowid是PK。
在日期,项目,模块和RefNumber上创建索引。
在启用行锁和页面锁的情况下创建表。
我正在使用SQL Server 2005。
希望你们能给我一些专业的建议,以启发我。谢谢。
最佳答案
您可以使用“ Nolock”表提示,如下所述:
Table Hints MSDN
您的SQL将变成这样:
select top 200000 * from dbo.transactionlog with (no lock) ...
如果您不关心返回的数据的完整准确性,则可以实现更好的性能。
关于sql - 在运行大量插入的同时选择百万条以上的记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/896907/