2016-08-23 2 views
0

J'ai une table avec des milliers de lignes qui ne cessent de grandir chaque jour. Une colonne a un objet JSON sur lequel j'ai besoin d'exécuter beaucoup de requêtes. Quelle est la meilleure approche?SQL Server 2016 JSON Index

Voici un exemple d'une requête:

SELECT 
    PersonId, 
    AccountNumber, 
    JSON_VALUE(M.message, '$.PID.PID_5.PID_5_1') as FirstName, 
    JSON_VALUE(M.message, '$.PID.PID_5.PID_5_2') as LastName, 
    JSON_VALUE(M.message, '$.PID.PID_7.PID_7_1') as DOB, 
    JSON_VALUE(M.message, '$.PID.PID_8.PID_8_1') as Gender, 
    JSON_VALUE(M.message, '$.PV1.PV1_44.PV1_44_1') As ArrivalTs, 
    JSON_VALUE(M.message, '$.PV2.PV2_3.PV2_3_2') as Reason 
FROM 
    dbo.Messages M 

est la meilleure option pour créer un index pour chaque colonne?

Exemple:

CREATE UNIQUE CLUSTERED INDEX PK_PersonView ON PersonView 
(
    PersonId, FirstName, LastName, DOB, Gender, ArrivalTs, Reason 
); 

Ou devrais-je créer des index séparés

CREATE INDEX idx_Person_FirstName 
    ON Messages(FirstName) 

Je suis en train de construire le retour de requête possible rapide, mais actuellement cela va vraiment lent.

Répondre

0

Si vous avez un indice composé , il peut être utilisé ne si les n colonnes les plus à gauche sont utilisés dans la requête (dans la clause WHERE).

Ainsi, votre exemple sera certainement PAS aide si vous avez WHERE DOB = .... ou WHERE Gender = .... ou quelque chose comme ça - ne si le n colonnes sont utilisées plus à gauche.

Si vous avez des questions qui limitent presque toujours le résultat sur PersonId et FirstName et LastName et peut-être plus - alors qu'un indice composé de puissance aide .... sinon, les index plus petits pourrait être le chemin à parcourir (sur les colonnes qui ont une haute sélectivité, par exemple retourner un petit nombre de rangées pour une valeur donnée - Gender est une colonne pas très sélective, puisque soit la valeur mâle ou femelle retournera en moyenne la moitié des rangs ---> ne sera probablement jamais être utilisé ....