Requête prenant de longs conseils de réglage s'il vous plaît

J'ai une collection de tables SQL Server contenant des informations d'enquête et je voudrais exécuter une requête qui a une ligne pour chaque enquête et une colonne pour chaque réponse.

La structure est configurée comme suit:

 ResponseHeader: ID (record for each survey) Responses: ID responseHeaderID questionID answerItemsID AnswerItems: ID (This is the value needed in each answer column) answerText 

Ce qui suit est la requête que j'ai trouvée:

 SELECT ResponseHeader.id , ResponseHeader.YOS , ResponseHeader.rankID , ResponseHeaderunitID , ResponseHeader.age , ResponseHeader.gender , MAX(CASE WHEN Responses.questionID = 42 THEN AnswerItems.id END) , MAX(CASE WHEN Responses.questionID = 43 THEN AnswerItems.id END) , MAX(CASE WHEN Responses.questionID = 44 THEN AnswerItems.id END) , --.....there are 79 of these lines in the query, one for each question (Responses.questionID) MAX(CASE WHEN Responses.questionID = 48 THEN AnswerItems.id END) , MAX(CASE WHEN Responses.questionID = 48 THEN AnswerItems.id END) , MAX(CASE WHEN Responses.questionID = 50 THEN AnswerItems.id END) , MAX(CASE WHEN Responses.questionID = 49 THEN AnswerItems.id END) FROM ResponseHeader LEFT OUTER JOIN Responses ON ResponseHeader.id = Responses.responseHeaderID LEFT OUTER JOIN AnswerItems ON Responses.answerItemsID = AnswerItems.id WHERE completed = 1 GROUP BY ResponseHeader.id , YOS , rankID , unitID , age , gender ORDER BY ResponseHeader.id; 

Il returnne le jeu de résultats correct mais il faut 18 secondes pour s'exécuter dans l'Analyseur de requêtes. Il renvoie 4592 lignes et il a 85 colonnes. Malheureusement, il atteint la limite de la memory tampon IIS conséquent, il est considéré comme prenant du time à utiliser dans une page ASP classique. L'augmentation de la limite du tampon n'est pas une option pour le travail. Je ne sais pas comment get cette information autrement.

Je lisais des requêtes de pivot mais je ne les comprenais pas. Y at-il un moyen d'get mes résultats en utilisant cette méthode ou toute autre méthode plus rapide?

Essayez quelque chose comme ça –

 DECLARE @Responses TABLE (responseHeaderID INT, questionID INT, answerItemsID INT) DECLARE @ResponseHeader TABLE (id INT, YOS INT, rankID INT, unitID INT, age INT, gender CHAR(1), completed BIT) SELECT * FROM ( SELECT DISTINCT rh.id , rh.YOS , rh.rankID , rh.unitID , rh.age , rh.gender FROM @ResponseHeader rh WHERE completed = 1 ) rh LEFT JOIN ( SELECT * FROM ( SELECT r.responseHeaderID , r.questionID , r.answerItemsID FROM @Responses r ) t PIVOT ( MAX(answerItemsID) FOR questionID IN ([42], [43], [44], [48], [50], [49]) ) p ) t2 ON rh.id = t2.responseHeaderID ORDER BY rh.id 

Sortie –