2010-09-03 19 views
2

J'essaie d'aider mes utilisateurs à avoir plus d'accès à nos données, donc je n'ai pas besoin d'interrompre mon travail (jouer à Pac-Man) 25 fois par jour en écrivant des requêtes ad hoc et autres. J'essaie d'utiliser les vues de sources de données, les modèles de données et le Report Builder 2 et 3 pour leur permettre d'avoir accès à des données nettoyées dans lesquelles ils peuvent effectuer leur propre analyse de base en toute sécurité. Je souhaite créer des modèles de rapport génériques couvrant les processus métier plutôt qu'un modèle de rapport spécifique pour chaque rapport ad hoc dont ils auraient besoin.Signaler les inefficacités du modèle. J'ai besoin d'aide

Je dois créer la vue de source de données (DSV) avec une requête nommée car la base de données source manque de clés primaires, mais possède des index clusterisés uniques sur identity_columns.

Voici mon problème. Lorsque j'utilise une requête relativement simple comme ceci:

SELECT SOM.FSONO AS SalesNo 
    , SOM.FCUSTNO AS CustNo 
    ,SLC.fcompany as CustName 
    , SOM.FCUSTPONO AS CustPONo 
    , SOM.fsoldby AS SalesPerson 
    , SOR.FENUMBEr AS ItemNo 
    , SOR.finumber AS IntItemNo 
    , SOR.frelease AS Rels 
    , SOI.fprodcl AS ProdClass 
    , SOI.fgroup AS GroupCode 
    , rtrim(SOR.FPARTNO) AS PartNo 
    , SOR.fpartrev AS PartRev 
    , cast(SOI.fdesc AS VARCHAR(20)) AS PartDescription 
    ,SOM.forderdate as OrderDate 
    ,SOR.fduedate as DueDate 
    , SOR.FORDERQTY AS QtyOrd 
    , SOR.FUNETPRICE AS NetUnitPrice 
    , (SOR.FORDERQTY * SOR.funetprice) AS NetAmountOrdered 
FROM slcdpm SLC inner join 
somast SOM on SLC.fcustno = SOM.fcustno 
    LEFT OUTER JOIN soitem SOI 
     ON (SOM.fsono = SOI.fsono) 
    LEFT OUTER JOIN sorels SOR 
     ON (SOI.fsono = SOR.fsono)  
AND  (SOI.finumber = SOR.finumber) 

Supposons que l'utilisateur prend le modèle de rapport dans le Générateur de rapports 3 et ne demande que SalesNo, d 'art, PartRev, OrderDate et TotalNetAmount pour leur jeu de données.

le SQL généré pour tirer ces données est:

SET DATEFIRST 7 
SELECT 
    CAST(1 AS BIT) [c0_is_agg], 
    CAST(1 AS BIT) [c1_is_agg], 
    CAST(1 AS BIT) [c2_is_agg], 
    CAST(1 AS BIT) [c3_is_agg], 
    4 [agg_row_count], 
    [CustomerSales].[TotalNetAmountOrdered] [TotalNetAmountOrdered], 
    [CustomerSales].[SalesNo] [SalesNo], 
    [CustomerSales].[PartNo] [PartNo], 
    [CustomerSales].[PartRev] [PartRev], 
    [CustomerSales].[OrderDate] [OrderDate] 
FROM 
    (
     SELECT 
      SUM([CustomerSales].[NetAmountOrdered]) [TotalNetAmountOrdered], 
      [CustomerSales].[SalesNo] [SalesNo], 
      [CustomerSales].[PartNo] [PartNo], 
      [CustomerSales].[PartRev] [PartRev], 
      [CustomerSales].[OrderDate] [OrderDate] 
     FROM 
      (
       SELECT  SOM.fsono AS SalesNo, SOM.fcustno AS CustNo, SLC.fcompany AS CustName, SOM.fcustpono AS CustPONo, SOM.fsoldby AS SalesPerson, 
         SOR.fenumber AS ItemNo, SOR.finumber AS IntItemNo, SOR.frelease AS Rels, SOI.fprodcl AS ProdClass, SOI.fgroup AS GroupCode, RTRIM(SOR.fpartno) AS PartNo, 
         SOR.fpartrev AS PartRev, CAST(SOI.fdesc AS VARCHAR(20)) AS PartDescription, SOM.forderdate AS OrderDate, SOR.fduedate AS DueDate, SOR.forderqty AS QtyOrd, 
         SOR.funetprice AS NetUnitPrice, SOR.forderqty * SOR.funetprice AS NetAmountOrdered 
FROM   slcdpm AS SLC INNER JOIN 
         somast AS SOM ON SLC.fcustno = SOM.fcustno LEFT OUTER JOIN 
         soitem AS SOI ON SOM.fsono = SOI.fsono LEFT OUTER JOIN 
         sorels AS SOR ON SOI.fsono = SOR.fsono AND SOI.finumber = SOR.finumber 
      ) [CustomerSales] 
     WHERE 
      CAST(1 AS BIT) = 1 
     GROUP BY 
      [CustomerSales].[SalesNo], [CustomerSales].[PartNo], [CustomerSales].[PartRev], [CustomerSales].[OrderDate] 
    ) [CustomerSales] 
ORDER BY 
    [SalesNo], [PartNo], [PartRev], [OrderDate] 

Je me serais attendu que les champs tirés que les demandes des utilisateurs dans le rapport et non pas tous les domaines unique dans la DSV. En outre, si des paramètres sont créés pour contraindre les données, comme une date de début et de fin pour OrderDate, l'ensemble de données complet est renvoyé de toute façon.

Est-ce que je fais quelque chose de mal ici?

Y a-t-il une meilleure façon d'aborder cela?

Les autres administrateurs rencontrent-ils des problèmes de performances lors de l'utilisation de modèles de rapport?

Répondre

4

Il existe parfois des problèmes de performances lors de l'utilisation de modèles de rapport. C'est l'une des raisons pour lesquelles les modèles de rapport ne sont pas conçus pour être déployés sur l'ensemble de vos utilisateurs afin de remplacer tous les rapports. Les requêtes générées par le moteur de requête sémantique derrière les modèles de rapports ne sont pas ajustables et ne sont généralement PAS la façon dont vous les écrivez vous-même. Le moteur traite essentiellement la requête nommée comme une vue, qu'elle développe dans la requête sous-jacente, tout comme elle le ferait pour une vue. C'est souvent un problème lors de la construction d'un modèle recouvrant directement votre base de données. De mon point de vue, la situation idéale est d'avoir une base de données séparée (éventuellement un datawarehouse) logée de préférence sur un serveur séparé. Ce dw serait aplani de sorte que vous puissiez l'optimiser pour des performances de lecture. Ensuite, vous pourriez utiliser ces tables directement dans votre vue de source de données et le moteur de recherche sémantique derrière le modèle devrait être capable de faire de meilleures requêtes.

Cet idéal est souvent impossible en raison de contraintes économiques ou autres. Pourriez-vous essayer d'avoir un travail plus ou moins ETL de vos tables de base dans un nouvel ensemble de tables que vous pourriez optimiser pour générer des rapports afin de prendre en charge votre modèle?

+0

C'est en fait un projet entièrement distinct sur lequel j'ai travaillé. Mon espoir est de libérer du temps actuellement utilisé par toutes les demandes ad hoc pour que je puisse travailler sur le projet DW. – DavidStein

+1

J'espère que cela fonctionne pour vous, monsieur. :) – MarkVSQL