Sql 运行大插入时选择百万条以上记录
我试图从单个表中提取应用程序日志文件。select查询语句非常简单Sql 运行大插入时选择百万条以上记录,sql,sql-server,select,concurrency,Sql,Sql Server,Select,Concurrency,我试图从单个表中提取应用程序日志文件。select查询语句非常简单 select top 200000 * from dbo.transactionlog where rowid>7 and rowid <700000 and Project='AmWINS' 上述选择的查询时间超过5分钟。它被认为是长的吗?select正在运行时,大容量插入也在运行 [编辑] 事实上,我目前的生产日志数据库存在严重问题, 基本上,我们只有一个表transactionlog。所有应用程序日
select top 200000 *
from dbo.transactionlog
where rowid>7
and rowid <700000 and
Project='AmWINS'
上述选择的查询时间超过5分钟。它被认为是长的吗?select正在运行时,大容量插入也在运行
[编辑]
事实上,我目前的生产日志数据库存在严重问题,
基本上,我们只有一个表transactionlog。所有应用程序日志都将插入到此表中。对于像AmWINS这样的项目,基于选择计数结果,我们每天插入大约800K++记录。记录的插入在生产环境中每天24小时运行。如果用户希望检查事务日志,则用户希望从表中提取数据。因此,如果需要,我们需要从表中选择记录
我试着在UAT环境下模拟产量,直到今天,产量已经增长到1000万记录。在我尝试提取记录的同时,我模拟了批量插入,使其看起来与生产环境一致。仅提取20万条记录就需要5分钟
在提取运行期间,我监视SQL Physcal server CPU上的峰值高达95%
这些表有13个字段和一个带有bigint的标识onrowid。rowid是PK。
索引创建日期、项目、模块和参考编号。
这些表是在启用rowlock和pagelock的情况下创建的。
我正在使用SQLServer2005
希望你们能给我一些专业的建议来启发我。谢谢。这取决于您的硬件。插入数据时拉出200000行需要一些严重的IO,因此除非您有30多个磁盘系统,否则速度会很慢
另外,您的rowID列是否已编制索引?这将有助于选择,但可能会降低批量插入的速度。我不确定,但MS SQL中的批量插入不会锁定整个表吗?正如ck所说。索引很重要。因此,请确保已准备好适当的索引。我不仅要在rowId上设置索引,还要在Project上设置索引。我还要将where子句改写为:
WHERE Project = 'AmWINS' AND rowid BETWEEN 8 AND 699999
原因:我猜Project比rowid更具限制性,如果我错了,请纠正我,BETWEEN比<和>比较快。这里没有多少索引会有帮助,因为它是一个SELECT*查询,所以很可能是PK扫描或可怕的bookup查找 顶部是没有意义的,因为没有订单 据我所知,同步插入可能会产生误导,除非表只有2列,而大容量插入锁定了整个表。对于一个简单的int-IDENTITY列,insert和select可能不会相互干扰 特别是如果批量插入只有几行1000行,甚至10000行
编辑。TOP和rowid值并不意味着超过一百万,您可以使用Nolock table提示,如下所述: 您的SQL将变成这样:
select top 200000 * from dbo.transactionlog with (no lock) ...
如果您不关心返回数据的完整准确性,这将获得更好的性能。您将如何处理200000行?你在网络上运行这个吗?根据表的宽度,仅通过网络获取数据量可能是花费的大部分时间。您也可以将其导出为本地dat或sql文件。您使用的是Microsoft sql Server吗?为什么还要提取这么多事务日志项?为什么同时运行大容量插入?最好将这两个任务按顺序进行,这取决于锁定模型。执行大容量插入时,可以选择表锁或行锁。表锁定速度更快,但该表不可用于其他请求。行锁定速度较慢,因为一次只锁定一行。我想您会发现执行引擎会以相同的方式运行查询。我想这取决于表上的索引。我自学了如何写限制性最强的专栏,这是索引的第一步;您可能会看到锁升级;但是你也应该确保你有足够的临时空间。更好的是,在写端配置隔离。这样也就不用写侧锁了。然后解耦,批量插入-但这是另一个故事和复杂的。这篇文章的排数是一个低级笑话。我有每天插入5000万行的表格,没有这样的问题。