获取数百万条记录太慢了

     2023-05-09     259

关键词:

【中文标题】获取数百万条记录太慢了【英文标题】: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。如果源表的主键是数字,那么使用该方法的速度将比通过偏移量更一致。 OFFSETFETCH 将逐渐变慢,因为每次迭代都必须重新计算偏移量。如果您按聚集索引键的范围而不是行号分页进行批处理,您将获得线性性能。 感谢您的回答。如何按聚集索引键的范围而不是行号分页进行批处理?你能解释一下吗? 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&... 查看详情