je suppose que tu as exécuté la requête sur des données réelles avec un plus ou moins gros volume?
Si oui, Combien de ligne as-tu dans ta table ?
as tu mis les index qui vont bien ?
Cordialement,
Version imprimable
le résultat de la CTE c'est 135 000 lignes, sans filtres, en 15s.
en mettant un index sur la table temporaire et exécutant les filtres, j'obtiens les mêmes délais :( (> de 30 min)
Bonjour,
N'étant pas sur d'avoir compris à 100% le résultat attendu, voici une proposition :
La CTE data est bien entendu a remplacer par la source de données.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 WITH data(ID, pred, suiv) AS ( SELECT 'B' AS id, 'A' as pred, 'C' as suiv UNION SELECT 'C', 'B', null UNION SELECT 'A', null, 'B' ), chaine(ID, suiv, result) AS ( SELECT id, suiv, CAST(id AS VARCHAR(MAX)) FROM data WHERE pred IS NULL UNION ALL SELECT D.id, E.suiv, D.result + ', ' + E.id FROM chaine AS D INNER JOIN data AS E ON D.suiv = E.id ) SELECT * FROM chaine WHERE suiv IS NULL;
En gros, la requête construit la chaîne de manière récursive (comme le fait la solution de StringBuilder). La différence, c'est qu'elle ne recherche pas les doublons puisqu'elle ne retient que les chaînes complètes, sans prédécesseur, ni successeur.
Mais sans jeu de données sur lequel confronter les résultats, ce n'est pas évident de bien comprendre le problème et d'y proposer une solution adéquat.
Pourquoi utiliser une table temporaire ? c'est contre-performant.
que donne
au besoin modifie le nom de ta table 'noeud' dans le script dans la clause whereCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 SELECT TOP 25 dm_mid.database_id AS DatabaseID, dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact, dm_migs.last_user_seek AS Last_User_Seek, OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName], 'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_' + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','') + CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN '_' ELSE '' END + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','') + ']' + ' ON ' + dm_mid.statement + ' (' + ISNULL (dm_mid.equality_columns,'') + CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (dm_mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement FROM sys.dm_db_missing_index_groups dm_mig INNER JOIN sys.dm_db_missing_index_group_stats dm_migs ON dm_migs.group_handle = dm_mig.index_group_handle INNER JOIN sys.dm_db_missing_index_details dm_mid ON dm_mig.index_handle = dm_mid.index_handle WHERE dm_mid.database_ID = DB_ID() and OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) = 'noeud' ORDER BY Avg_Estimated_Impact DESC GO
Cordialement,