【发布时间】:2021-09-12 05:24:29
【问题描述】:
这是关于如何在不使用 OpenJson 且仅使用 Json_Value 的情况下优化 json 列的 microsoft 文档:https://docs.microsoft.com/en-us/sql/relational-databases/json/index-json-data?view=sql-server-ver15
我的问题是我有一个 JSON 列,其中包含一个数组,我试图从数组中的每个元素中获取所有名为 Test_ID 的键,以与连接语句 testId 进行比较,虽然它可以工作,但它相对较慢。 400 行大约需要 9 秒。我正在尝试以指数方式加快速度,似乎唯一的方法是通过该文章中提到的索引,但我似乎无法弄清楚如何为数组执行此操作。
我的 JSON 是这样的:'{"Property":{"Label":"0"},"Tests":[{"Test_ID":"GUID_HERE","Type":{"Label":" "},"Name":{"Label":" "},"Value":null,{"Test_ID":"GUID_HERE","Type":{"Label":" "},"Name":{"Label":" "},"Value":" "}]}'
这是我清理后的查询
SELECT DISTINCT w.W_ID,
'Proc' ProcHeaderName, p.ProcNumber ProcValue,
'Class' ClassHeaderName, p.Class ClassValue
INTO #Procs
FROM proc p
LEFT JOIN (SELECT wt.W_ID, wt.TestId
from TestValue wt where wt.IsDeleted = 0) as wtRow on wtRow.W_ID in (SELECT ID FROM #tmp)
LEFT JOIN TableNameHere c on c.IsDeleted = 0 and c.col_ID in (SELECT col_ID FROM tmp)
WHERE p.IsDeleted = 0 and [dbo].[GetTestIdJson](c.Json, wtRow.TestId) = wtRow.TestId
AND p.ProcNumber + ',' + p.RNumber = JSON_VALUE(c.Json,'$.Property.Label') + ',' + JSON_VALUE(c.Json,'$.Property.Label')
GROUP BY wtRow.W_ID, p.ProcNumber, p.Class
【问题讨论】:
-
对于性能相关的问题,我们需要查看您的执行计划。
-
考虑到必须为连接数据集中的每一行调用标量函数 dbo.GetTestIdJson(),并且可能不会在任何计划估算中出现实际成本。
标签: json sql-server indexing query-optimization virtual-column