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 需要更多时间的主要内容,如果未能解决你的问题,请参考以下文章

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

sql server查询性能where子句

where 子句中使用的 SQL Server 查询性能视图

SQL Server If 条件在 where 子句?

WHERE 子句中的 SQL 查询子选择优化 (SQL Server)

将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句