2011-04-18 3 views
2

Donc, j'ai un sérieux problème parce que mon dernier temps d'exécution de requête est de 8 minutes pour obtenir 2500 nœuds. Et c'est juste une combinaison de 2 autres vues.Vues fonctionne lentement, dois-je utiliser select dans les tables temporaires?

Première vue est:

SELECT 
    RecTime, SQL AS str, ID, 
    ROW_NUMBER() OVER(ORDER BY RecTime,ID) AS rwnb 
FROM   
    (SELECT 
     A.RecTime, X.SQL, X.ID 
    FROM 
     dbo.EventView AS A 
    CROSS JOIN 
     dbo.Incident AS X 
    WHERE  
     (PATINDEX('%' + A.Col + '%', X.SQL) > 0)) AS INC 

1 deuxième et 1600 noeuds

vue Second est:

SELECT  
    D.RecTime, D.Event, D.ID, CAST(CASE WHEN X.[Value] IS NULL THEN 0 ELSE X.[Value] END AS bit) AS Value 
FROM   
    dbo.XDependencedEvents AS D 
INNER JOIN 
    dbo.EventView AS X ON X.Col = D.Event 
          AND D.RecTime BETWEEN X.RecTime AND X.ChangedDate 

3 secondes temps d'exécution et 2100 nœuds

et dernière vue est

SELECT 
    X.[Rectime], X.[ID], X.[str], D.[Event], D.[Value],X.[rwnb] 
FROM 
    [XDependencedIncidents] AS X 
INNER JOIN [XEventStates] AS D ON X.[Rectime] = D.[Rectime] 
            AND X.[ID] = D.[ID] 

8 minutes et 2500 nœuds.

J'utilise même RowNumber AS rwnb pour accélérer le travail avec les vues mais cela reste très lent. Dois-je utiliser select dans les tables temporaires pour les 2 premières vues? Ou je fais quelque chose de mal ici?

Le but final est d'obtenir des valeurs pour certains « groupes » de « événements » pour chaque fois que des « événements » changement

+2

Avoir un 'PATINDEX()' avec un caractère générique recto-verso en tant que clause 'WHERE' sera toujours assez lent. – Orbling

Répondre

1

Ma solution bizarre utilise RowNumber aime modifier 2ème et dernier Vues comme:

SELECT  D.RecTime, D.Event, D.ID 
,CAST(CASE WHEN X.[Value] IS NULL THEN 0 ELSE X.[Value] END AS bit) AS Value 
,ROW_NUMBER() OVER(ORDER BY D.RecTime,D.ID) AS rwnb 
FROM   dbo.XDependencedEvents AS D 
    INNER JOIN 
    dbo.EventView AS X 
     ON X.Col = D.Event 
     AND D.RecTime BETWEEN X.RecTime AND X.ChangedDate 

et

SELECT X.[Rectime] , X.[ID] , X.[str], D.[Event], D.[Value],X.[rwnb], D.[rwnb] 
FROM [XDependencedIncidents] AS X 
INNER JOIN [XEventStates] AS D ON X.[ID] = D.[ID] 
AND X.[Rectime] = D.[Rectime] 

Que pensez-vous de cette méthode bizarre d'optimisation? Je veux vraiment une meilleure solution s'il y en a.

BTW oui, l'ajout de numéro de ligne fait de 8 minutes -> 5 secondes.

+1

Vous pouvez changer 'CAST (CASE WHEN X. [Valeur] EST NULL ALORS 0 ELSE X. [Valeur] END AS bit) 'à' CAST (COALESCE (X. [Valeur], 0) Bit AS) ' –

1

essayez ceci:

SELECT X.[Rectime] , X.[ID] , X.[str], D.[Event], D.[Value],X.[rwnb] 
FROM [XDependencedIncidents] AS X 
INNER JOIN [XEventStates] AS D ON X.[ID] = D.[ID] 
WHERE X.[Rectime] = D.[Rectime] 

Si c'est aussi lent. Vérifiez le XEventStates Indexing.

+0

il est aussi lent, déjà 6 minutes +, peut-être même plus lent) qu'est-ce qui ne va pas avec XEventStates Indexing? Peut-être que je dois utiliser RowNumber pour la deuxième vue aussi? – Cynede

+0

Je pense que Rectime est datetime datafield, peut être 'X. [Rectime] = D. [Rectime]' cet endroit prend du temps. essayez-le sans cette condition !! –

+0

Oui. J'ai trouvé une solution bizarre - jetez un coup d'œil, peut-être que je peux l'améliorer ... – Cynede

Questions connexes