2010-09-03 56 views
2

我試圖幫助我的高級用戶更多地訪問我們的數據,所以我不必每天寫25次(打Pac-Man)寫作特別查詢等工作。報告模型效率低下。需要建議

我試圖使用數據源視圖,數據模型和報表生成器2和3來允許他們訪問已清理的數據,以便他們可以安全地進行自己的基本分析。我想創建覆蓋業務流程的通用報表模型,而不是針對他們需要的每個特定報表的特定報表模型。

我必須使用命名查詢創建數據源視圖(DSV),因爲源數據庫缺少主鍵,但在identity_columns上具有唯一的聚簇索引。

這是我的問題。當我用這樣一個相對簡單的查詢:

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) 

假設用戶需要在報表生成器3的報表模型,只要求SalesNo,PARTNO,PartRev,訂購日期,和TotalNetAmount他們的數據集。

產生拉動該數據的SQL是:

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] 

我本來預計只有場拉到其在報告中的用戶請求,而不是任何一個領域的DSV。另外,如果創建的參數限制OrderDate的開始日期和結束日期等數據,則無論如何將返回完整的數據集。

我在這裏做錯了什麼?

有沒有更好的方法來解決這個問題?

使用報告模型時,其他管理員是否發現自己的性能問題?

回答

4

處理報告模型時有時會出現性能問題。這是報告模型不適用於所有用戶更換所有報告的原因之一。報告模型後面的語義查詢引擎生成的查詢不可調,通常也不是您自己寫這些查詢的方式。

引擎實質上將命名查詢視爲視圖,它將視圖展開到底層查詢中,就像視圖一樣。構建直接覆蓋數據庫的模型時,這通常是個問題。

從我的角度來看,理想的情況是要有一個單獨的數據庫(可能是數據倉庫),它最好安裝在單獨的服務器上。這個dw將會變平,這樣你可以優化它的讀取性能。然後,您可以直接在數據源視圖中使用這些表,並且模型後面的語義查詢引擎應該能夠做出更好的查詢。

由於經濟或其他限制,這種理想往往是不可能的。你可以嘗試從基礎表中獲得一份或多或少的ETL到一組新的表格中,這些表格可以通過優化來支持你的模型?

+0

這實際上是一個完全獨立的項目,我一直在努力。我的希望是釋放一些目前被所有臨時請求使用的時間,以便我可以在DW項目上工作。 – DavidStein 2010-09-03 18:25:59

+1

我希望這能爲你解決,先生。 :) – MarkVSQL 2010-09-03 21:11:43