高效地将大型JSON文件加载到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

我一直在尝试确定将大型JSON文件加载到SQL Server中最有效的方法是什么

我有一个相当原始的API,它可以非常有效地返回一个150+MB的JSON字符串,其中包含约450k行和12列。最终,我希望能够在power查询中使用它,我认为最简单的存储、索引和高效查询方法是在SQL Server中

我问过关于从源代码中过滤数据的问题(最符合逻辑的解决方案,但出于这个问题的目的,请将其计算出来)

我尝试了下面这样的代码来证明它可以工作

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秒