SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间

Posted

技术标签:

【中文标题】SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间【英文标题】:SQL Server : query apply in where clause with IS NOT Null on Column that contains Json Object taking more time 【发布时间】:2018-03-23 05:31:01 【问题描述】:

我在 SQL Server 数据库中有一个表,其中列包含 JSON 对象,并且我使用 openJson JSON_Value 和 JSON_Query 函数遍历 where 子句条件和 IN NOT NULL 的列。查询运行成功,但需要更多时间响应输出。仅 4 行,耗时 7 秒。 那么如果表有 1000 行呢?

表格看起来是这样的:

这是我正在使用的表上的查询:

SELECT TOP (1000) 
    [Id], JSON_Value(objectJson,'$.Details.Name.Value') AS objectValue 
FROM  
    [geodb].[dbo].[userDetails]
WHERE
    JSON_QUERY(jsonData,'$."1bf1548c-3703-88de-108e-bf7c4578c912"') IS NOT NULL

那么,如何优化上述查询以减少时间?

【问题讨论】:

【参考方案1】:

我建议更改表格:

ALTER TABLE dbo.Table
ADD Value AS JSON_VALUE(JsonData, '$.Details.Name.Value');

然后在值列上创建一个非聚集索引

CREATE NONCLUSTERED INDEX IX_ParsedValue ON dbo.Table (Value)

这将加快查询速度。

【讨论】:

感谢您的回复。但我不应该更改现有表。您能帮我换一种方式吗? 我在表上应用了插入触发器并展平Json,然后在新创建的表上应用了非聚集索引。

以上是关于SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间的主要内容,如果未能解决你的问题,请参考以下文章