私は、 "CROSS APPLY OPENJSON("を使用して複数のクロスアプリケーションを追加したり、jsonドキュメントが大きくなりすぎると遅くなります。フィルタリングしようとしているデータにインデックスを追加しようとしましたが、クロスアプリケーションを使用して作業するためにネストされた配列アイテムの構文を取得できません。インデックス。MSのドキュメントによると、私はちょうど私が、何かクエリ上、その後に、ネストされた、配列の項目のすべての値を取得し、インデックスを追加することにより、パフォーマンスを向上させることができるはずMS SQLのjsonクエリ/ where句のネストされた配列アイテム
JSON_query(my_column, $.parentItem.nestedItemsArray1.nestedItemsArray2)
を行うことができるはずこの
ALTER TABLE mytable ADD vdata AS JSON_query(my_column, $.parentItem.nestedItemsArray1.nestedItemsArray2') CREATE INDEX idx_json_my_column ON mytable(vdata)
ただし、上記の$ .array.arrayitems構文は機能しません。 サイドノートでは、私は助けをカントが、通常はSQLで私はMSの例のようJSON_QUERYを使用するときに平らに取得するインデックスので
col --- 1| 2| 3|
のようなデータの列をしかしJSONデータ思わリレーショナル観点から考えます私は私のプラグ
?私はインデックスが肥育データの内部データを返しますしない限り、値の配列ではなく、平坦化されたバージョンをincdexするとし、「「1,2,3」を取得し、実施例に
を再生しますdeclare @mydata table ( ID int NOT NULL, jsondata varchar(max) NOT NULL ) INSERT INTO @mydata (id, jsondata) VALUES (789, '{ "Id": "12345", "FinanceProductResults": [ { "Term": 12, "AnnualMileage": 5000, "Deposits": 0, "ProductResults": [] }, { "Term": 18, "AnnualMileage": 30000, "Deposits": 15000, "ProductResults": [] }, { "Term": 24, "AnnualMileage": 5000, "Deposits": 0, "ProductResults": [ { "Key": "HP", "Payment": 460.28 } ] }, { "Term": 24, "AnnualMileage": 10000, "Deposits": 0, "ProductResults": [ { "Key": "HP", "Payment": 500.32 } ] }]}') SELECT j_Id ,JSON_query (c.value, '$.Term') as Term ,JSON_Value (c.value, '$.AnnualMileage') as AnnualMileage ,JSON_Value (c.value, '$.Deposits') as Deposits ,JSON_Value (p.value, '$.Key') as [Key] ,JSON_Value (p.value, '$.Payment') as Payment --,c.value FROM @mydata f CROSS APPLY OPENJSON(f.jsondata) WITH (j_Id nvarchar(100) '$.Id') CROSS APPLY OPENJSON(f.jsondata, '$.FinanceProductResults') AS c CROSS APPLY OPENJSON(c.value, '$."ProductResults"') AS p where ID = 789 AND JSON_Value (p.value, '$.Payment') = '460.28'
これらのMSドキュメントをg私用ガイド:
アップデートを
私は少し方法
SELECT j_Id, FinanceDetails.Term, FinanceDetails.AnnualMileage, FinanceDetails.Deposits, Payments.Payment FROM @mydata f CROSS APPLY OPENJSON(f.jsondata) WITH (j_Id nvarchar(100) '$.Id') OUTER APPLY OPENJSON (f.jsondata, '$.FinanceProductResults') WITH ( Term INT '$.Term', AnnualMileage INT '$.AnnualMileage', Deposits INT '$.Deposits', ProductResults NVARCHAR(MAX) '$.ProductResults' AS JSON ) AS FinanceDetails OUTER APPLY OPENJSON(ProductResults, '$') WITH ( Payment DECIMAL(19, 4) '$.Payment' ) AS Payments WHERE Payments.Payment = 460.28
"と" 使用して性能もを改善することができましたが、私はまだ追加したいですパフォーマンスを向上させるためにサブアレイデータのインデックス?
私はそれがMS SQL 2016のサポートされているjsonの種類であると期待していました。ネストされたアイテムのインデックス作成をサポートすることになります。まだ少なくとも私は今私が知っている私は何かを欠場していないことを知っているとそのちょうど不可能、ありがとう:) –