En raison d'une variété de décisions de conception, nous avons une table, 'CustomerVariable'. CustomerVariable a trois bits d'information - son propre identifiant, un identifiant à variable (une liste de paramètres possibles que le client peut avoir), et la valeur de cette variable. D'autre part, la table Variable contient les informations sur une valeur par défaut - dans le cas où la variable CustomerVariable n'est pas définie. Cela fonctionne bien dans la plupart des situations, ce qui nous permet de ne pas avoir à créer une liste d'informations incroyablement longue - en particulier dans le cas où 16 variables similaires doivent être gérées pour un client.Accélération d'une requête SQL avec des informations de données génériques
Le problème vient en essayant d'obtenir cette information dans un select. Jusqu'à présent, notre «meilleure» solution implique beaucoup trop de jointures pour être efficace - nous obtenons une liste des 16 VariableIds dont nous avons besoin d'informations, en les plaçant dans des variables, d'abord. Par la suite, cependant, nous devons faire:
CROSS JOIN dbo.Variable v01
LEFT JOIN dbo.CustomerVariable cv01 ON cv01.customerId = c.id
AND cv01.variableId = v01.id
CROSS JOIN dbo.Variable v02
LEFT JOIN dbo.CustomerVariable cv02 ON cv02.customerId = c.id
AND cv02.variableId = v02.id
-- snip --
CROSS JOIN dbo.Variable v16
LEFT JOIN dbo.CustomerVariable cv16 ON cv16.customerId = c.id
AND cv16.variableId = v16.id
WHERE
v01.id = @cv01VariableId
v02.id = @cv02VariableId
-- snip --
v16.id = @cv16VariableId
Je sais qu'il doit y avoir une meilleure façon, mais nous ne pouvons pas sembler le trouver au milieu temps de crise. Toute aide serait grandement appréciée.
Comment déterminez-vous qu'il y a trop de jointures pour être efficace? –
ce qui est avec les CROIX JOINS? montrer plus de la requête! –
@rexem: Je pense que 16 auto se qualifie. ;) – NotMe