2012-10-19 2 views
1

Après avoir recherché d'autres réponses pour voir si cette question particulière a déjà été posée (et d'autres ont été posées - ne couvrant pas tout ce dont j'ai besoin Renseignez-vous sur), je voudrais poser le scénario suivant et demander des conseils sur la façon la plus efficace de créer cette requête de reporting. Ceci est un post verbeux et je ne suis pas autorisé à poster un code T-SQL malheureusement - mon employeur l'a expressément interdit.Besoin de conseils sur la meilleure façon d'écrire Une grande requête de reporting à partir d'une source assez complexe

Une chose que j'ai appris au fil des années est qu'il ya beaucoup plus de gens là-bas qui connaissent un diable de beaucoup plus que moi - donc après la recherche et de ne pas trouver ce que vous avez besoin, il suffit de demander à quelqu'un :)

Toutes les tables ont des clés primaires et s'il existe des tables liées à des tables enfants, des clés étrangères sont en place. La base de données et le serveur de rapports sont SQL 2008 R2. Le serveur exécute 128 Go de RAM et est une beastie hyper-threadée 4CPU Quad core. D'abord, j'ai un ensemble de tables qui contiennent des emplacements, des sections et des secteurs. Un emplacement est lié par une table de mappage à une section - il y a plusieurs emplacements dans une section, des sections sont liées à des zones via une table de mappage et plusieurs sections sont associées à une zone. Ces tables sont toutes situées dans la base de données "A". J'ai créé une vue dans une base de données distincte "B" qui représente les liens Area - Section - Location dans un jeu de résultats agréable qui s'exécute rapidement. J'appelle cela la vue LocationSectionArea.

Dans la base de données "B", des milliers d'utilisateurs entrent leurs statistiques quotidiennes concernant toutes sortes de catégories de leur travail. Il y a actuellement 91 catégories. Chaque catégorie contiendra des sous-catégories qui varient d'environ 3 à 25. Le nombre de catégories et de sous-catégories peut changer à tout moment, d'autres étant ajoutées ou supprimées via une interface d'administration. J'ai créé une vue qui représente ces liens et retourne un ensemble de résultats appelé la vue CategorySubCategoryFields. Les informations collectées pour chacune de ces catégories/sous-catégories de liens varient - certaines nécessitent environ 8 champs différents, tandis que d'autres nécessitent 3, et d'autres seulement 1. Ces champs sont liés à leurs sous-catégories appropriées. Ceci est à nouveau contenu dans la base de données "B".

J'ai construit une vue qui rassemble joliment ces données dans cette base de données qui se termine par une grande matrice de résultats qui présente les données d'une manière qui peut être rapporté assez facilement, et l'exécution des vues semble jusqu'à présent être tout à fait acceptable en vitesse. J'appelle cela le UserStatsView. Ceci est contenu dans la base de données "B".

Maintenant, les utilisateurs saisissant les données sont affectés à l'un des emplacements mentionnés précédemment. Les résultats sont requis pour afficher tous les emplacements dans une section, et toutes les sections dans une zone, ainsi que pour chaque emplacement, indiquent chacune des catégories et sous-catégories de cette catégorie. Cela doit ensuite être lié aux résultats de UserStatsView afin que vous obteniez une matrice assez grande de ces résultats mélangés avec beaucoup de 0 là où il n'y a pas de résultats - mais ils sont créés à des fins de reporting. Les rapports doivent permettre à un utilisateur, par exemple, de sélectionner une section, puis produire un rapport de tous les emplacements contenus dans cette section, ainsi qu'un décompte des résultats saisis par les utilisateurs pour cet emplacement - pour chaque Combinaison de catégorie-sous-catégorie il y a. Il doit présenter tous les emplacements pour la section et toutes les catégories-sous-catégories, qu'il y ait des résultats réels saisis par les utilisateurs ou non. Donc, il peut y avoir beaucoup de 0 sur certains rapports.

Pour cela, j'ai créé une vue de résultats qui se joint à la zone LocationSectionArea avec la vue CategorySubCategoryFields. Cela a créé la matrice de base que je veux.Je suis ensuite parti rejoindre cette matrice aux résultats de UserStatsView, en rejoignant les LocationId, CategoryId et SubCategoryId pour insérer les résultats pour les utilisateurs pour les emplacements. Tout cela est créé dans la base de données "B".

Maintenant tout cela fonctionne et est "ok" à condition de fournir suffisamment de filtres dans la clause finale où réduire le nombre d'enregistrements. Comme vous pouvez l'imaginer - s'ils essaient d'exécuter un rapport avec un ensemble de résultats plus important - il commence à devenir très lent. (Une plage de dates de 6 mois pour tous les sites prend plus de 30 secondes)

Une partie de mon problème est que je crois que les informations de localisation sont liées à partir de la base de données "A" et que la vue construite est contenue dans la base de données "B "ainsi que tous les tableaux et enregistrements de vues pour toutes les autres informations requises pour ce rapport.

Une autre partie est je crois la jointure croisée très grande et complexe créée qui est ensuite liée à la vue des résultats des utilisateurs. La jointure croisée est un résultat cartésien sans index ni données associées jusqu'à ce qu'il soit joint à l'ensemble de résultats UserStatsView.

Et le troisième problème, je crois, est le fait que des données sont "créées" pour remplir tous les blancs afin de produire la structure des résultats qui peut ensuite être introduite dans SSRS. J'ai vu que la mise en file d'attente des tables et les jointures de hachage prennent beaucoup de temps d'exécution, ainsi que les recherches dans la base de données avec les emplacements, les sections et les zones. Tous ces éléments ont été affichés via le plan estimé d'exécution de la requête.

Ce que je demande, c'est si quelqu'un sait s'il existe une meilleure façon de générer cet ensemble de résultats compte tenu des critères décrits ci-dessus. Ai-je complètement manqué un moyen très simple et rapide de le faire, ce qui est hautement probable :). Si quelqu'un peut suggérer ce que je devrais rechercher, je partirai volontiers et je le ferai - je ne sais pas trop quoi rechercher à ce stade?

Salutations

Rod.

Mise à jour: ce qui suit est la structure de table qui définit les deux bases de données. Évidemment, il y en a plus dans les vraies tables, mais c'est le noeud de la façon dont ils s'accrochent ensemble. S'il vous plaît excusez un tel article - j'ai tout supprimé sauf les champs clés et certains champs de données afin que vous puissiez voir comment les tableaux sont structurés. Les noms des tables et des champs ont été changés en noms génériques avec beaucoup de champs supplémentaires supprimés afin que je puisse poster le code.


Base de données A

**Location Table** 
LocationId BIGINT PK 
LocationName Varchar(100) 


**Section Table** 
SectionId Bigint PK 
SectionName varchar(100) 



**Area Table** 
AreaId Bigint PK 
AreaName varchar(100) 



**LocationSectionMap Table** 
LocSecId Bigint PK 
LocationId Bigint FK Index to Location Table 
SectionId BigInt FK Index to Section Table 




**SectionAreaMap Table** 
SecAreaId Bigint PK 
SectionId Bigint FK Index to Section Table 
AreaId Bigint FK Index to Area Table 

Database B

**Categories Table** 
CategoryId Bigint PK 
categoryName varchar(100) 



**SubCategories Table** 
SubCategoryId Bigint 
CategoryId Bigint FK to Categories Table 
SubCategoryType Int 
FieldTypeId Int (1, 2, 3 or 4) 


**UserStats Table** 
UserStatId bigint PK 
UserId Bigint 
StartDate DateTime 
EndDate DateTime 
LocationId Bigint --> this is the location ID in Location table in database A 
SectionId Bigint --> this is the Section ID in Section Table in database A 
AreaId Bigint --> this is the Area ID of the Area Table in database A 



**FieldType1 Table** 
FieldType1Id bigint PK 
UserStatId Bigint FK to UserStats Table 
SubCategoryId Bigint FK to Subcategories Table 
Value1 int 
Value2 int 





**FieldType2 Table** 
FieldType2Id bigint PK 
UserStatId Bigint FK to UserStats Table 
SubCategoryId Bigint FK to Subcategories Table 
Value1 int 
Value2 int 
Value4 int 
Value5 int 
Value6 int 
Value7 int 
Value8 int 
Value9 int 
Value10 int 


**FieldType3 Table** 
FieldType3Id bigint PK 
UserStatId Bigint FK to UserStats Table 
SubCategoryId Bigint FK to Subcategories Table 
Value1 int 
Value2 int 
Value11 int 
Value12 int 
Value13 int 
Value14 int 
Value15 int 
Value16 int 


**FieldType4 Table** 
FieldType4Id bigint PK 
UserStatId Bigint FK to UserStats Table 
SubCategoryId Bigint FK to Subcategories Table 
CombinedValue1And2 int 



**SubCategoryAssociations Table** 
SubCategoryAssociationId Int PK 
ReportOfSubCategoryId bigint FK to Subcategories Table 
IncludeValuesFromSubcategoryId Bigint FK to Subcategories Table 

Vues: Area-Section-Lieu Voir dans la base de données (A) vwAreasSectionsAndLocations

SELECT  A.AreaId, A.AreaName, C.SectionId, C.SectionName, E.LocationId, E.LocationName 
FROM   DatabaseA.dbo.tblAreas AS A INNER JOIN 
         DatabaseA.dbo.tblAreaSections AS B ON A.AreaId = B.AreaId INNER JOIN 
         DatabaseA.dbo.tblSections AS C ON B.SectionId = C.SectionId INNER JOIN 
         DatabaseA.dbo.tblSectionLocations AS D ON C.SectionId = D.SectionId INNER JOIN 
         DatabaseA.dbo.tblLocations AS E ON D.LocationId = E.LocationId 

Catégorie-Sous-catégorie Voir dans la base de données B (vwCategoryAndSubCategory)

SELECT  TOP (100) PERCENT dbo.tblCategories.CategoryId, 
      dbo.tblCategories.CategoryName, 
         dbo.tblSubCategory.SubCategoryId, 
         dbo.tblSubCategory.SubCategoryname, 
       dbo.tblSubCategory.SubCategoryTypeId 
FROM   dbo.tblCategories INNER JOIN 
         dbo.tblSubCategory ON dbo.tblCategories.CategoryId = dbo.tblSubCategory.CategoryId 
ORDER BY dbo.tblCategories.CategoryName, dbo.tblSubCategory.SubCategoryname 

Voir que Cross rejoint les deux points de vue pour créer la matrice de résultats nécessaires (sans résultats) (vwAreaSectionLocationCategorySubCategory)

SELECT  dbo.vwCategoryAndSubCategory.CategoryId, dbo.vwCategoryAndSubCategory.CategoryName, 
         dbo.vwCategoryAndSubCategory.CategoryPlacementOrder, dbo.vwCategoryAndSubCategory.IsStandardDaybookEntryCategory, 
         dbo.vwCategoryAndSubCategory.SubCategoryId, dbo.vwCategoryAndSubCategory.SubCategoryname, dbo.vwCategoryAndSubCategory.SubCategoryTypeId, 
         dbo.vwCategoryAndSubCategory.SubCategoryPlacementOrder, dbo.vwAreasSectionsAndLocations.AreaId, dbo.vwAreasSectionsAndLocations.AreaName, 
         dbo.vwAreasSectionsAndLocations.SectionId, dbo.vwAreasSectionsAndLocations.SectionName, dbo.vwAreasSectionsAndLocations.LocationId, 
         dbo.vwAreasSectionsAndLocations.LocationName 
FROM   dbo.vwCategoryAndSubCategory CROSS JOIN 
         dbo.vwAreasSectionsAndLocations 

Voir qui crée l'utilisation des résultats de statistiques (vwUserStatsResults)

SELECT  dbo.tblUserStats.UserStatId, 
    dbo.tblUserStats.UserId, 
    dbo.tblUserStats.LocationId, 
     dbo.tblUserStats.SectionId, 
    dbo.tblUserStats.AreaId,      
      dbo.tblUserStats.StartDate, 
    dbo.tblUserStats.EndDate, 
    dbo.tblFieldType1.CategoryId, 
    dbo.tblFieldType1.SubCategoryId, 
      1 AS FieldTypeId, 
    (dbo.tblFieldType1.Value1 + ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType1 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType2 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType3 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0)) 
        AS Value1, (dbo.tblFieldType1.Value2 + ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType1 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType2 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType3 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType1.UserStatId = A.UserStatId), 0)) 
        AS Value2, Value1 + Value2 AS CombinedValue1And2, 0 AS Value3, 0 AS Value4, 
        0 AS Value5, 0 AS Value6, 0 AS Value7, 0 AS Value8, 
        0 AS Value9, 0 AS Value10, 0 AS Value11, 0 AS Value12, 0 AS Value13, 
        0 AS Value14, 0 AS Value15, 0 AS Value16 
FROM   dbo.tblUserStats INNER JOIN 
        dbo.tblFieldType1 ON dbo.tblUserStats.UserStatId = dbo.tblFieldType1.UserStatId 

UNION ALL 

SELECT  dbo.tblUserStats.UserStatId, 
    dbo.tblUserStats.UserId, 
    dbo.tblUserStats.LocationId, 
      dbo.tblUserStats.SectionId, 
    dbo.tblUserStats.AreaId, 
      dbo.tblUserStats.StartDate, 
    dbo.tblUserStats.EndDate, 
    dbo.tblFieldType2.CategoryId, 
    dbo.tblFieldType2.SubCategoryId, 
      2 AS FieldTypeId, 
    dbo.tblFieldType2.Value1 + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType1 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType2 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType3 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        AS Value1, dbo.tblFieldType2.Value2 + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType1 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType2 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType3 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType2.UserStatId = UserStatId)), 0) 
        AS Value2, dbo.tblFieldType2.Value1 + dbo.tblFieldType2.Value2 AS CombinedValue1And2, 
        ISNULL(dbo.tblFieldType2.Value3, 0), ISNULL(dbo.tblFieldType2.Value4, 0), 
        ISNULL(dbo.tblFieldType2.Value5, 0), ISNULL(dbo.tblFieldType2.Value6, 0), 
        ISNULL(dbo.tblFieldType2.Value7, 0), ISNULL(dbo.tblFieldType2.Value8, 0), 
        ISNULL(dbo.tblFieldType2.Value9, 0), ISNULL(dbo.tblFieldType2.Value10, 0), 
        0 AS Value11, 0 AS Value12, 0 AS Value13, 0 AS Value14, 0 AS Value15, 
        0 AS Value16 
FROM   dbo.tblUserStats INNER JOIN 
        dbo.tblFieldType2 ON dbo.tblUserStats.UserStatId = dbo.tblFieldType2.UserStatId 
UNION ALL 
SELECT  dbo.tblUserStats.UserStatId, 
    dbo.tblUserStats.UserId, 
    dbo.tblUserStats.LocationId, 
    dbo.tblUserStats.SectionId, 
    dbo.tblUserStats.AreaId, 
      dbo.tblUserStats.StartDate, 
    dbo.tblUserStats.EndDate, 
    dbo.tblFieldType3.CategoryId, 
    dbo.tblFieldType3.SubCategoryId, 
      3 AS FieldTypeId, 
    dbo.tblFieldType3.Value1 + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType1 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType2 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value1) AS Expr1 
          FROM   dbo.tblFieldType3 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        AS Value1, dbo.tblFieldType3.Value2 + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType1 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType2 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        + ISNULL 
         ((SELECT  SUM(Value2) AS Expr1 
          FROM   dbo.tblFieldType3 AS A 
          WHERE  (FieldId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  (ReportOnSubCategoryId = A.SubCategoryId))) AND (dbo.tblFieldType3.UserStatId = UserStatId)), 0) 
        AS Value2, dbo.tblFieldType3.Value1 + dbo.tblFieldType3.Value2 AS CombinedValue1And2, 0 AS Value3, 
        0 AS Value4, 0 AS Value5, 0 AS Value6, 0 AS Value7, 
        0 AS Value8, 0 AS Value9, 0 AS Value10, 
        ISNULL(dbo.tblFieldType3.Value11, 0), ISNULL(dbo.tblFieldType3.Value12, 0), 
        ISNULL(dbo.tblFieldType3.Value13, 0), ISNULL(dbo.tblFieldType3.Value14, 0), 
        ISNULL(dbo.tblFieldType3.Value15, 0), ISNULL(dbo.tblFieldType3.Value16, 0) 
FROM   dbo.tblUserStats INNER JOIN 
        dbo.tblFieldType3 ON dbo.tblUserStats.UserStatId = dbo.tblFieldType3.UserStatId 
UNION ALL 
SELECT  dbo.tblUserStats.UserStatId, 
    dbo.tblUserStats.UserId, 
    dbo.tblUserStats.LocationId, 
      dbo.tblUserStats.SectionId, 
    dbo.tblUserStats.AreaId, 
      dbo.tblUserStats.StartDate, 
    dbo.tblUserStats.EndDate, 
    dbo.tblFieldType4.CategoryId, 
    dbo.tblFieldType4.SubCategoryId, 
      4 AS FieldTypeId, 
    0 AS Value1, 0 AS Value2, dbo.tblFieldType4.CombinedValue1And2 + (ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType1 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType2 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value1) 
          FROM   dbo.tblFieldType3 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0)) 
        + (ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType1 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType2 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0) 
        + ISNULL 
         ((SELECT  SUM(A.Value2) 
          FROM   dbo.tblFieldType3 A 
          WHERE  A.SubCategoryId IN 
                (SELECT DISTINCT IncludeValuesFromSubCategoryId 
                 FROM   dbo.tblSubCategoryAssociations 
                 WHERE  ReportOnSubCategoryId = A.SubCategoryId) AND dbo.tblFieldType4.UserStatId = A.UserStatId), 0)) 
        AS CombinedValue1And2, 0 AS Value3, 0 AS Value4, 0 AS Value5, 0 AS Value6, 
        0 AS Value7, 0 AS Value8, 0 AS Value9, 0 AS Value10, 
        0 AS Value11, 0 AS Value12, 0 AS Value13, 0 AS Value14, 0 AS Value15, 
        0 AS Value16 
FROM   dbo.tblUserStats INNER JOIN 
        dbo.tblFieldType4 ON dbo.tblUserStats.UserStatId = dbo.tblFieldType4.UserStatId 

Et enfin le vue qui tire tous ensemble (vwReportResults)

Publié dans une autre entrée en raison de limitations de caractère

+1

Vous n'avez pas besoin d'afficher les noms réels de la table/des champs ... Mais il serait difficile de parier que vous obtiendrez une bonne réponse à partir du mur de texte. – Shmiddty

+0

Je vais reconstituer la structure pour que vous ayez une idée de la façon dont elle se bloque. – Roddles

+0

Je "nettoie" les vues et le code SQL de mon mieux pour le rendre générique - en prenant un peu de temps - je reviens bientôt. – Roddles

Répondre

0

suite de la Poste précédente en raison des restrictions de caractère ...

SELECT  TOP (100) PERCENT dbo.vwAreaSectionLocationCategorySubCategory.categoryId, 
     dbo.vwAreaSectionLocationCategorySubCategory.categoryName, 
        dbo.vwAreaSectionLocationCategorySubCategory.SubCategoryId, 
        dbo.vwAreaSectionLocationCategorySubCategory.SubCategoryName, 
     dbo.vwAreaSectionLocationCategorySubCategory.FieldTypeId, 
        dbo.vwAreaSectionLocationCategorySubCategory.AreaId, 
        dbo.vwAreaSectionLocationCategorySubCategory.AreaName, 
     dbo.vwAreaSectionLocationCategorySubCategory.SectionId, 
        dbo.vwAreaSectionLocationCategorySubCategory.SectionName, 
     dbo.vwAreaSectionLocationCategorySubCategory.LocationId, 
        dbo.vwAreaSectionLocationCategorySubCategory.LocationName, 
     ISNULL(dbo.vwUserStatsResults.UserStatsId, 0) AS UserStatsId, 
        ISNULL(dbo.vwUserStatsResults.UserId, 0) AS UserId, 
     ISNULL(dbo.vwUserStatsResults.LocationId, 0) AS LocationId, 
     ISNULL(dbo.vwUserStatsResults.SectionId, 0) AS SectionId, 
     ISNULL(dbo.vwUserStatsResults.AreaId, 0) AS AreaId, 
        ISNULL(dbo.vwUserStatsResults.StartDate, N'2000-01-01') AS StartDate, 
     ISNULL(dbo.vwUserStatsResults.EndDate, N'2000-01-01') AS EndDate, 
        ISNULL(dbo.vwUserStatsResults.Value1, 0) AS Value1, 
     ISNULL(dbo.vwUserStatsResults.Value2, 0) AS Value2, 
     ISNULL(dbo.vwUserStatsResults.CombinedValue1And2, 0) AS CombinedValue1And2, 
     ISNULL(dbo.vwUserStatsResults.Value3, 0) AS Value3, 
     ISNULL(dbo.vwUserStatsResults.Value4, 0) AS Value4, 
        ISNULL(dbo.vwUserStatsResults.Value5, 0) AS Value5, 
     ISNULL(dbo.vwUserStatsResults.Value6, 0) AS Value6, 
     ISNULL(dbo.vwUserStatsResults.Value7, 0) AS Value7, 
        ISNULL(dbo.vwUserStatsResults.Value8, 0) AS Value8, 
     ISNULL(dbo.vwUserStatsResults.Value9, 0) AS Value9, 
     ISNULL(dbo.vwUserStatsResults.Value10, 0) AS Value10, 
        ISNULL(dbo.vwUserStatsResults.Value11, 0) AS Value11, 
     ISNULL(dbo.vwUserStatsResults.Value12, 0) AS Value12, 
        ISNULL(dbo.vwUserStatsResults.Value13, 0) AS Value13, 
     ISNULL(dbo.vwUserStatsResults.Value14, 0) AS Value14, 
     ISNULL(dbo.vwUserStatsResults.Value15, 0) AS Value15, 
        ISNULL(dbo.vwUserStatsResults.Value16, 0) AS Value16 
FROM   dbo.vwAreaSectionLocationCategorySubCategory LEFT OUTER JOIN 
        dbo.vwUserStatsResults ON dbo.vwAreaSectionLocationCategorySubCategory.LocationId = dbo.vwUserStatsResults.LocationId AND 
        dbo.vwAreaSectionLocationCategorySubCategory.SubCategoryId = dbo.vwUserStatsResults.SubCategoryId AND 
        dbo.vwAreaSectionLocationCategorySubCategory.FieldTypeId = dbo.vwUserStatsResults.FieldTypeId AND 
        dbo.vwAreaSectionLocationCategorySubCategory.categoryId = dbo.vwUserStatsResults.categoryId 
0

Je crois que je l'ai découvert mon répondre après avoir trouvé et lu un article sur les performances de jointure croisée et les choses à faire et à ne pas faire, avec un article sur la modification de vos vues en fonctions définies par l'utilisateur Table-Valued, je vais simplement convertir les vues en TV-UDF et filtrer les "Vues" dès le départ pour réduire la charge de travail à laquelle SQL Server doit faire. Cela devrait, espérons-le, réduire les volumes de données renvoyés et arrêter ou réduire la mise en file d'attente des tables.

Questions connexes