如何提高具有OPENJSON的T-SQL查询的性能以过滤JSON数组属性

时间:2018-08-09 05:02:22

标签: json sql-server performance

我有一个包含JSON数组列(nvarchar(max))的表,该表具有数百万行,预计将来将成为数十亿行。

表结构如下:

[SnapshotId] - PK,
[BuildingId],
......................
[MeterData],

MeterData包含如下的Json数组:

[{
    "MeterReadingId": 0,
    "BuildingMeterId": 1,
    "Value": 1.0,   
}, {
    "MeterReadingId": 0,
    "BuildingMeterId": 2,
    "Value": 1.625, 
}]

我需要按“ HourlySnapshot”表进行过滤,例如,“ BuildingMeterId = 255”,写下面的查询

SELECT * 
FROM [HourlySnapshot] h 
CROSS APPLY OPENJSON(h.MeterData) 
    WITH (BuildingMeterId int '$.BuildingMeterId') AS MeterDataJson
WHERE MeterDataJson.BuildingMeterId = 255

工作正常,但是由于解析JSON而导致性能下降。我读到您可以通过创建索引来克服性能问题。我创建了如下的聚集索引

CREATE CLUSTERED INDEX CL_MeterDataModel 
    ON [HourlySnapshot] (MeterDataModel)

但是看不到速度方面的任何改进。我做错了吗?什么是提高速度的最佳方法。

谢谢

NeroIsNoHero

1 个答案:

答案 0 :(得分:2)

The combination of a computed column and an index may help.

ALTER TABLE [HourlySnapshot]
ADD [BuildingMeterId] AS JSON_VALUE([MeterData], '$.BuildingMeterId');

CREATE NONCLUSTERED INDEX IX_ParsedBuildingMeterId ON [HourlySnapshot] (BuildingMeterId)

这实际上使SQL Server在插入/更新时解析并索引该值。读取时,它可以使用索引而不进行全表扫描。