Actuellement, nous utilisons une vue que j'ai créée qui tire des données d'un certain nombre de tables. Le principal facteur à propos de celui-ci consiste à faire valoir que les spécifications impliquent un mélange de CTES et de cordes concaténantes pour combiner plusieurs lignes dans une colonne (plusieurs fois). Bien que l'opinion fonctionne, les utilisateurs se sont récemment plaints d'être trop lent.
Actuellement, la configuration de la vue ressemble à ceci:
;
With thing1 AS
(
SELECT DISTINCT
/* huge block of code with joins and such
that gets the individual fields and concatenates
personnel names to one row */
)
,
thing2 AS
(
SELECT TaskName,
Company,
Lease,
TaskBegin,
TaskEnd,
Field,
Personnel,
Invoice,
InvDate,
InvTot,
ROW_NUMBER() OVER (Partition by TaskName ORDER BY [TaskName] ASC) rn
FROM thing1
)
SELECT TaskName,
Company,
Lease,
Field,
ISNULL(Personnel, '') as 'Personnel',
TaskBegin,
TaskEnd,
ISNULL (STUFF( (SELECT ', ' + Invoice
FROM thing1
WHERE (thing1.TaskName = thing2.TaskName)
AND thing2.rn = 1
ORDER BY Invoice
FOR XML PATH('')), 1, 1, ''), '') AS 'Invoice',
ISNULL (STUFF( (SELECT ', ' + InvDate
FROM thing1
WHERE (thing1.TaskName = thing2.TaskName)
AND thing2.rn = 1
ORDER BY Invoice
FOR XML PATH('')), 1, 1, ''), '') AS 'InvoiceDate',
ISNULL (STUFF( (SELECT ', ' + InvTot
FROM thing1
WHERE (thing1.TaskName = thing2.TaskName)
AND thing2.rn = 1
ORDER BY Invoice
FOR XML PATH('')), 1, 1, ''), '') AS 'InvoiceTotal'
FROM thing2 WHERE rn = 1
GO
Donc cela fonctionne comme prévu. Le problème est, une fois que je suis arrivé à ce dernier sélection qui concaténe la facture, Invdate et InvToTot, la requête passe de ne pas avoir besoin d'une seconde unique (c'est-à-dire une sélection droite de la chose2) de prendre jusqu'à 7 secondes pour exécuter son cours. (Le temps moyen est d'environ 5 secondes.) Je suis assez confiant qu'une partie du blâme réside dans la base de données en croissance constante - cette vue charge beaucoup plus rapidement dans l'environnement de test, qui compte beaucoup moins de documents.
Ma question est donc la suivante: est-il possible d'y aller de manière plus rapide et moins intensive de ressources sur la DB?
Cela ressemble à ce que vous avez est un modèle EAV (de sorte que le bloc de code se joint principalement à la même prise) que vous devez transposer pour signaler. Si tel est le cas, vous trouverez peut-être la fonctionnalité PIVOT
peut rendre ces CTES plus efficaces (à la fois dans la lisibilité du code et le temps d'exécution d'exécution): http://technet.microsoft.com/fr- US/Bibliothèque/MS177410 (v = SQL.105) .aspx
Si vous croyez que FOR XML PATH
est le coupable qui ralentit la vue, vous pouvez utiliser une approche différente pour concaténer des lignes dans une seule colonne. Ceci SQL Fiddle Démontrer comment utiliser un CTE récursif pour la concaténation.
Il suffit d'insérer CTE1, CTE2, CTE2 et CTE4 entre votre truc1 et votre chose2, puis utilisez simplement la facture, l'invalitive, les colonnes invtot à partir de CTE4 directement à la place de vos trois dernières colonnes (où vous utilisez le chemin XML)