Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行大插入时选择百万条以上记录_Sql_Sql Server_Select_Concurrency - Fatal编程技术网

Sql 运行大插入时选择百万条以上记录

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查询语句非常简单

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万行的表格,没有这样的问题。