我在SQLServer数据库中有一个表,它的列是json类型的。
Table - SomeTable
Id | Properties
1 | {"field1":"value1", "field2":"value2", "field3":"value3", "field4":"value4"}
2 | {"field1":"value1", "field2":"value2", "field3":"value3", "field4":"value4"}
...|...
我编写了select查询,它分别选择每个字段的值:
SELECT
JSON_VALUE(Properties, '$.field1') as field1,
JSON_VALUE(Properties, '$.field2') as field2,
JSON_VALUE(Properties, '$.field3') as field3,
JSON_VALUE(Properties, '$.field4') as field4
FROM SomeTable
我在微软的文档中发现了这种方法(https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver15)
在查询中编写许多json\u值会影响性能吗?sql正在对查询中写入的每个json值进行字符串反序列化。
2条答案
按热度按时间nvbavucw1#
你可以试着用
OPENJSON()
使用显式模式来解析存储在Properties
包含一个函数调用的列(针对四个或多个函数调用)JSON_VALUE()
电话):表格:
声明:
结果:
作为补充说明
JSON_VALUE()
是类型的标量值nvarchar(4000)
. 与OPENJSON()
和显式模式,您可以为返回的列定义适当的数据类型。7kjnsjlb2#
我想就你的问题做个测试:
在查询中编写许多json\u值会影响性能吗?sql正在对查询中写入的每个json值进行字符串反序列化。
因此,我创建了以下脚本并在我的家庭工作站上进行了测试:
这将使用您的解决方案
JSON_VALUE
同时也是一个OPENJSON
解决方案(这是我在zhorov发布答案的同时写的)。在我的工作站上,这导致以下消息输出:请注意,第二行
OPENJSON
,每次跑快约2秒。然而,这是有10000000000行的,但是它确实证实了json的单个解析远远快于4行。