2016-11-14 13 views
2

私は、 "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私用ガイド:

How to create an index

How to get data

アップデートを

私は少し方法

 

    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 

"と" 使用して性能もを改善することができましたが、私はまだ追加したいですパフォーマンスを向上させるためにサブアレイデータのインデックス?

答えて

0

現在、ネストされたプロパティをインデックスできません。 フルテキスト検索オプションはありますか?あなたは、JSONの列にFTSを作成し、述語が追加される場合があります:

WHERE .... 
AND CONTAINS(jsondata, 'NEAR(('Payments,460),1)') 

JSONがテキストであるので、この述語は(これは識別しますお互いに近く、「お支払い」や460のようなものを持っていないすべてのレコードを除外しますキー:値のペア)、縮小された行セットに対してCROSS APPLYを適用することができます。

+0

私はそれがMS SQL 2016のサポートされているjsonの種類であると期待していました。ネストされたアイテムのインデックス作成をサポートすることになります。まだ少なくとも私は今私が知っている私は何かを欠場していないことを知っているとそのちょうど不可能、ありがとう:) –