将 280,000 条记录的大型数据表的每个变体插入另一个表的更快方法是啥?
Posted
技术标签:
【中文标题】将 280,000 条记录的大型数据表的每个变体插入另一个表的更快方法是啥?【英文标题】:What is a faster way to insert every variation of a large datatable of 280,000 records into another table?将 280,000 条记录的大型数据表的每个变体插入另一个表的更快方法是什么? 【发布时间】:2015-12-28 22:53:03 【问题描述】:我有一个包含 280,000 条记录的 LocationID、Lat、Long 的表。
我想将匹配的每个变体插入到一个新表中。
例如,对于记录 A、B 和 C,我最终会得到 AB、BC 和 AC
我的 TSQL 查询是
INSERT INTO Distances (ID1, ID2, Distance)
SELECT a1.ID, a2.ID, 0
FROM Location a1
JOIN Location a2 ON a1.ID <> a2.ID
然后,我希望运行另一个查询,该查询将使用工作标量函数和经纬度从 0 更新距离列。但是,仅插入语句就需要 40 多分钟才能运行。
我认为我可以将 Locations 表保存到一个更快的数据库中(也许是 JsonDB?),但没有使用其他数据库的经验,并且不确定哪个会最快。
我正在运行 Windows 10,并且更喜欢 gui。 用于处理的数据库必须允许可以对纬度/经度进行数学运算的标量样式函数。
有什么建议吗?
【问题讨论】:
@PieterGeerkens,他正在插入~280,000 * 280,000 / 2 = 39,200,000,000
行。任何数据库都需要一段时间。
@VladimirBaranov:嗯。是的,我的笔记本电脑很难高效地执行 390 亿次插入操作。
尝试在较小的集合上比较性能并立即计算INSERT
查询中的距离,而不是插入 0 然后再次更新所有行。在INSERT
中计算距离很可能会更有效。顺便说一句,SQL Server 内置了spatial functions。 PostgreSQL 还支持空间类型和函数。
@VladimirBaranov 你提到的空间函数只是将我的一些查询从 9 秒往返减少到 0.8 秒。再说一次,我是如何编程这么久却没有遇到的,这超出了我的范围。但感谢您提及。
【参考方案1】:
确保您没有定义任何索引,并在表名后添加提示“WITH (TABLOCKX)”。这应该给你在表上的“简单日志记录”,并且应该更快一些。
此外,将计算作为插入的一部分进行。对如此大的表进行更新会给你一个 MASSIVE 事务日志,甚至可能因为它的大小而失败。在 SQL Server 上进行大量更新时,创建新表比更新现有表更有效,因为可以说服插入执行简单日志记录而不是完整日志记录。
您还可以通过意识到桌子实际上是对称的,将桌子的大小减半;将连接运行为“”。如果你真的需要两个方向,你可以在之后在顶部创建一个视图。
【讨论】:
以上是关于将 280,000 条记录的大型数据表的每个变体插入另一个表的更快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV
如何使用 PHP 和 MySQL 有效地对大型数据集进行分页?