关键词:
【中文标题】获取数百万条记录太慢了【英文标题】:Fetching Millions Records going too slow 【发布时间】:2018-07-30 10:47:29 【问题描述】:我正在尝试使用带有 Fetching 的聚集索引复制其他表中的 6000 万条记录。但是在 2000 万张唱片之后,它变得太慢了。我不知道我该怎么做。任何人都可以帮助我吗?这是我的计时。
1000000 百万分钟:1 2000000 百万分钟:0 3000000 百万分钟:0 40000 亿分钟:2 5000000 百万分钟:2 6000000 百万分钟:1 7000000 百万分钟:0 8000000 百万分钟:1 9000000 百万分钟:0 10000000 百万分钟:1 11000000 百万分钟:0 12000000 百万分钟:1 13000000 百万分钟:1 14000000 百万分钟:0 15000000 百万分钟:1 16000000 百万分钟:1 17000000 百万分钟:1 18000000 百万分钟:0 19000000 百万分钟:1 20000000 百万分钟:3 21000000 百万分钟:3 22000000 百万分钟:4 23000000 百万分钟:5 24000000 百万分钟:4 25000000 百万分钟:4 26000000 百万分钟:4 27000000 百万分钟:4 28000000 百万分钟:5 29000000 百万分钟:5 30000000 百万分钟:5 31000000 百万分钟:6 32000000 百万分钟:7 33000000 百万分钟:7 34000000 百万分钟:8 35000000 百万分钟:8 36000000 百万分钟:9 37000000 百万分钟:8 38000000 百万分钟:10 39000000 百万分钟:10 40000000 百万分钟:11 41000000 百万分钟:11 42000000 百万分钟:11 43000000 百万分钟:12 44000000 百万分钟:11 45000000 百万分钟:12 46000000 百万分钟:12 47000000 百万分钟:14 48000000 百万分钟:13 49000000 百万分钟:13 50000000 百万分钟:14 51000000 百万分钟:15 52000000 百万分钟:14 53000000 百万分钟:16 54000000 百万分钟:18 55000000 百万分钟:18 56000000 百万分钟:20 57000000 百万分钟:19 58000000 百万分钟:21 59000000 百万分钟:19
declare
@RecNo Int
, @RecCount Int
, @RecordST nvarchar(max)
, @str_date datetime
, @end_date datetime;
Set @RecNo = 0
select @RecCount = 1000000
While 1 = 1
Begin
set @str_date = getdate();
Insert Into dbo.test2(
ap_id
,lipt_id
,li_cntr
)
select
ap_id
,lipt_id
,li_cntr
from dbo.test
order by ap_id, lipt_id, li_cntr
offset @RecNo rows
fetch next @RecCount rows only;
if @@ROWCOUNT = 0
break
Set @RecNo += 1000000;
set @end_date = GETDATE() ;
set @RecordST = cast(@RecNo as nvarchar(max)) + ' Million Min:'+cast(DATEDIFF(MINUTE,@str_date,@end_date) as nvarchar(max))
RAISERROR(@RecordST,0,0) WITH NOWAIT
end
【问题讨论】:
如何在复制之前删除索引,然后在复制之后再次创建它? 由于使用了偏移量,偏移量越高,插入的方法就会越慢。您可能想阅读this old SO answer。如果源表的主键是数字,那么使用该方法的速度将比通过偏移量更一致。OFFSET
和 FETCH
将逐渐变慢,因为每次迭代都必须重新计算偏移量。如果您按聚集索引键的范围而不是行号分页进行批处理,您将获得线性性能。
感谢您的回答。如何按聚集索引键的范围而不是行号分页进行批处理?你能解释一下吗?
TOP(@RecCount) ... WHERE plip_ap_id > @LastValueProcessed ORDER BY plip_ap_id
每次都应该具有相同的性能特征。这要求您的表具有可以从中查找的唯一键。对于复合键,它变得更加烦人。
【参考方案1】:
首先,您需要删除所有约束,例如唯一性、PK 等。这是现有表中每个插入的瓶颈。
其次,如果您向表中插入的记录比现在多得多,那么您可以使用SELECT INTO
语句而不是INSERT
来提高性能。但请记住,SELECT INTO
创建了一个新表,因此您需要考虑如何附加以前存在的记录。
最后但并非最不重要的一点是,您可以使用循环并批量插入 1M 记录。
【讨论】:
我想使用SELECT INTO
语句,但我不知道该语句是否使用Tempdb?因为我的硬盘没有足够的空间来存储 60M 记录。
如果我在插入后定义约束有什么问题吗?
这取决于约束,但在很多情况下您不会遇到问题oracle select sequence.nextval from dual 听起来太慢了
...06-0105:53:08【问题描述】:不久前,我在使用jdbc插入/更新数百万条记录时遇到了数据库性能问题。为了提高性能,我将代码更改为使用batch。然后我决定使用jprofiler监控代码以了解性能提高了多少…… 查看详情
通过 API 获取数百万条记录
】通过API获取数百万条记录【英文标题】:FetchingmillionsofrecordsthroughAPI【发布时间】:2015-12-1412:21:06【问题描述】:我的应用程序通过cURL向我的其他应用程序调用API,传递POST变量,如下所示:$curl=curl_init();curl_setopt_array($curl,array... 查看详情
从固定宽度的平面文件获取数百万条记录到 SQL 2000
】从固定宽度的平面文件获取数百万条记录到SQL2000【英文标题】:Getmillionsofrecordsfromfixed-widthflatfiletoSQL2000【发布时间】:2010-09-1117:44:25【问题描述】:显然我可以使用BCP,但这是问题所在。如果批处理中的一条记录的日期无效... 查看详情
删除数百万条记录 oracle [关闭]
】删除数百万条记录oracle[关闭]【英文标题】:deletemillionsofrecordsoracle[closed]【发布时间】:2016-01-0413:15:58【问题描述】:我们如何删除一个表中的3000万条记录。由于在线事务,我们无法删除并重新创建表。它是系统的关键表。... 查看详情
PairWise 匹配数百万条记录
】PairWise匹配数百万条记录【英文标题】:PairWisematchingmillionsofrecords【发布时间】:2013-11-2109:14:01【问题描述】:我手头有一个算法问题。为了方便地解释这个问题,我将使用一个简单的类比。我有一个输入文件Country,ExportsAustrai... 查看详情
在 NTFS 上打开许多小文件太慢了
...的子目录等)和500k小文件。遍历所有目录和文件,包括获取文件大小和计算总大小大约需要6秒。现在 查看详情
多连接数百万条记录的优化查询需要建议
】多连接数百万条记录的优化查询需要建议【英文标题】:Needsuggestiononoptimizationqueryofmultiplemillionofrecordswithmultiplejoins【发布时间】:2017-10-2111:15:01【问题描述】:如何优化此查询,因为EXT表每个包含大约150万条记录。我还有其... 查看详情
在数据表中显示数百万条记录
】在数据表中显示数百万条记录【英文标题】:showingmillionsofrecordsindatatable【发布时间】:2012-10-1212:32:51【问题描述】:我需要在分页表中显示数百万条记录。所以想知道根据性能选择哪一个更好。1.jqueryjqGrid2.AlloyUI数据表3.数据... 查看详情
数百万条记录的增量更新,索引与连接
】数百万条记录的增量更新,索引与连接【英文标题】:Incrementalupdateofmillionsofrecords,indexedvs.join【发布时间】:2012-08-2216:22:33【问题描述】:我目前正在制定一项增量更新用户数据的策略。我们假设我们的数据库中有100_000_000条... 查看详情
在具有数百万条记录的 2 个表上加入更快
】在具有数百万条记录的2个表上加入更快【英文标题】:Makingjoinon2tableswithmillionsrecordtobefaster【发布时间】:2014-07-2111:46:33【问题描述】:我有两张桌子security_stat=>拥有400万条记录security_trade=>拥有1000万条记录我已经成功运... 查看详情
为 ActiveRecord 测试创建数百万条记录
】为ActiveRecord测试创建数百万条记录【英文标题】:CreatemillionsofrecordsforActiveRecordtest【发布时间】:2012-09-0621:18:21【问题描述】:在Ruby中,我有一个测试,它是ActiveSupport::TestCase的子类,并通过Postgres(实际上是Greenplum)数据库... 查看详情
Rownum 或 Fetch/offset 适合选择和处理数百万条记录
】Rownum或Fetch/offset适合选择和处理数百万条记录【英文标题】:RownumorFetch/offsetisgoodtoselectandprocessmillionofrecords【发布时间】:2018-09-1613:25:38【问题描述】:我想从oracle读取数百万条记录并通过Java传输到另一个表。由于某种原因... 查看详情
根据其他表删除数百万条记录
】根据其他表删除数百万条记录【英文标题】:Deletemillionsofrecordsbasedonothertables【发布时间】:2016-08-1706:11:30【问题描述】:我有一个从外部源加载数据的主表。主表-PROD_MAIN的表结构是PROD_ROW_ID|PROD_VALUE|PROD_TYPE|PROD_DATE数据从主表... 查看详情
优化插入数百万条记录,MySQL 和 PHP
】优化插入数百万条记录,MySQL和PHP【英文标题】:Optimizedinsertinchuncksofmillionsofrecords,MySQLandPHP【发布时间】:2012-05-1601:10:25【问题描述】:我需要用PHP函数生成的随机SHA-1哈希值填充MySQL表。我正在尝试通过将其拆分为10000个块来... 查看详情
将数百万条记录从平面文件插入 SQL Server 的陷阱是啥?
】将数百万条记录从平面文件插入SQLServer的陷阱是啥?【英文标题】:WhatarethepitfallsofinsertingmillionsofrecordsintoSQLServerfromflatfile?将数百万条记录从平面文件插入SQLServer的陷阱是什么?【发布时间】:2010-09-1313:59:03【问题描述】:我... 查看详情
具有数百万条记录的 2 个数据帧之间的 Pyspark 交叉连接
】具有数百万条记录的2个数据帧之间的Pyspark交叉连接【英文标题】:Pysparkcrossjoinbetween2dataframeswithmillionsofrecords【发布时间】:2020-05-2918:44:18【问题描述】:我有2个数据框A(3500万条记录)和B(30000条记录)一个|Text|-------|pqr|---... 查看详情
如何使用 Talend Open Studio 处理数百万条 MongoDB 记录并将其插入 Postgres
】如何使用TalendOpenStudio处理数百万条MongoDB记录并将其插入Postgres【英文标题】:HowtoprocessandinsertmillionsofMongoDBrecordsintoPostgresusingTalendOpenStudio【发布时间】:2020-11-1618:25:00【问题描述】:我需要处理来自MongoDb的数百万条记录,并... 查看详情
使用 hive sql 批量插入数百万条记录到 hive?
】使用hivesql批量插入数百万条记录到hive?【英文标题】:batchinsertmillionsofrecordstohiveusinghivesql?【发布时间】:2014-11-0607:52:29【问题描述】:我想准备样本数据以在配置单元表上进行测试以镶木地板格式存储。表格如下所示:hive&... 查看详情