高效地将大型JSON文件加载到SQL Server中
我一直在尝试确定将大型JSON文件加载到SQL Server中最有效的方法是什么 我有一个相当原始的API,它可以非常有效地返回一个150+MB的JSON字符串,其中包含约450k行和12列。最终,我希望能够在power查询中使用它,我认为最简单的存储、索引和高效查询方法是在SQL Server中 我问过关于从源代码中过滤数据的问题(最符合逻辑的解决方案,但出于这个问题的目的,请将其计算出来) 我尝试了下面这样的代码来证明它可以工作高效地将大型JSON文件加载到SQL Server中,json,sql-server,Json,Sql Server,我一直在尝试确定将大型JSON文件加载到SQL Server中最有效的方法是什么 我有一个相当原始的API,它可以非常有效地返回一个150+MB的JSON字符串,其中包含约450k行和12列。最终,我希望能够在power查询中使用它,我认为最简单的存储、索引和高效查询方法是在SQL Server中 我问过关于从源代码中过滤数据的问题(最符合逻辑的解决方案,但出于这个问题的目的,请将其计算出来) 我尝试了下面这样的代码来证明它可以工作 DECLARE @JSON VARCHAR(MAX) sel
DECLARE @JSON VARCHAR(MAX)
select @JSON = BulkColumn
from OPENROWSET
(BULK 'C:\temp\test.txt', SINGLE_CLOB)
AS j
Select * FROM OPENJSON (@JSON)
我遇到的问题是,在配备快速SSD、16gb ram和i7-7800hq的笔记本电脑上查询7分钟后,我决定一定有更好的方法来解决这个问题
我很乐意尝试任何其他语言(比如python、r、C#clr)
安全性不是我最关心的,我想我应该能够在几秒钟内刷新数据,而不是等待几分钟。我从来没有遇到过在中加载大量数据(数百兆json)的问题,这只是我编写的C#app中加载这些文件的一个查询变量。。加载还包括一个查询,该查询只插入了不存在的记录
INSERT dba.dbo.Table(columns,from,json)
FROM
OPENJSON (@json, '$.result' )
WITH (
column varchar(256) '$.a',
from varchar(256) '$.b',
json varchar(256) '$.c'
) j
LEFT JOIN dba.dbo.Table b
ON
j.column = b.column
WHERE
b.column IS NULL
像这样的东西需要大约30秒来加载100mb的json并只插入新记录。c#看起来像:
using (SqlCommand sc = new SqlCommand("...", new SqlConnection(_connstr)))
{
sc.Parameters.Add("@json", SqlDbType.NVarChar, -1).Value = json;
var prior = sc.Connection.State;
if (sc.Connection.State != ConnectionState.Open)
sc.Connection.Open();
int ins = sc.ExecuteNonQuery();
if (prior == ConnectionState.Closed)
sc.Connection.Close();
return ins;
}
关键的是,我很少需要做您正在做的事情(将所有行作为SSMS结果集或任何东西检索回来)。我会做的负载,然后做的工作,我需要与他们。您等待的相当一部分时间可能是SSM检索数百万行的时间谢谢。我想因为我可能已经锁定了sql内存空间,所以我会检查一下。是的,如果将数据加载到表中比加载到查询结果窗口更快,您会感兴趣吗。。?我仍然认为7分钟是sql解析和返回jsonI所说的相当长的时间。我使用的服务器的规格比正常情况高出几个等级,但我预计大部分时间都花在将入站数据连接到现有服务器上。我发现我的问题主要与尝试将整个json字符串返回到一个字段有关。。。有元数据{…},值{…}。一旦我得到openjson正确解析数据,我的查询时间就下降到12-14秒