Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 server 将一个包含280000条记录的大型数据表的每个变体插入另一个表中的更快方法是什么?_Sql Server_Database_Tsql_Bigdata - Fatal编程技术网

Sql server 将一个包含280000条记录的大型数据表的每个变体插入另一个表中的更快方法是什么?

Sql server 将一个包含280000条记录的大型数据表的每个变体插入另一个表中的更快方法是什么?,sql-server,database,tsql,bigdata,Sql Server,Database,Tsql,Bigdata,我有一张包含LocationID、Lat和Long的表,共有280000条记录 我想在新表中插入匹配的每个变体 例如,对于记录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 插入距离(ID1、ID2、距离) 选择a1.ID、a2.ID、

我有一张包含LocationID、Lat和Long的表,共有280000条记录

我想在新表中插入匹配的每个变体

例如,对于记录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
插入距离(ID1、ID2、距离)
选择a1.ID、a2.ID、0
从位置a1
连接a1.ID a2.ID上的位置a2
然后,我希望运行另一个查询,该查询将使用工作标量函数和lat和longs从0更新距离列。但是,仅insert语句需要40多分钟才能运行

我想我可以将Locations表保存到一个更快的数据库(可能是JsonDB?)中,但没有使用其他数据库的经验,也不确定哪一个最快

我运行的是windows 10,更喜欢gui。 用于处理的数据库必须允许标量样式的函数可以在lat/long上执行数学操作


有什么建议吗?

确保没有定义索引,并在表名后添加提示“WITH(TABLOCKX)”。这将使您能够在表上进行“简单的日志记录”,并且应该更快一些

此外,作为插入的一部分进行计算。对如此大的表进行更新会给您带来大量的事务日志,甚至可能因为它的大小而失败。在SQL Server上执行大型更新时,创建新表比更新现有表更有效,因为可以说服insert执行简单日志记录而不是完全日志记录


你也可以通过意识到你的桌子实际上是对称的来将它的大小减半;运行join作为“@PieterGeerkens,他正在插入
~280000*280000/2=39200000000
行。任何数据库都需要一段时间。@VladimirBaranov:啊,是这样。是的,我的笔记本电脑将难以有效地执行390亿次插入。请尝试在较小的集合上比较性能,并立即在
INSERT
查询中计算距离,而不是插入0,然后再次更新所有行。很可能在
INSERT
中计算距离会更有效。顺便说一句,SQLServer有内置的。PostgreSQL还支持空间类型和函数。@VladimirBaranov您提到的空间函数将我的一些查询从9秒的往返时间缩短到了.8秒。再说一次,我是如何编程这么长时间而没有遇到这是我无法理解的。但是谢谢你提到它。