我有一个包含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
答案 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在插入/更新时解析并索引该值。读取时,它可以使用索引而不进行全表扫描。