2

私はパワーユーザーが私たちのデータにもっとアクセスできるように手助けしようとしているので、アドホッククエリなどを書くのに1日25回仕事(パックマンをプレイする)を中断する必要はありません。

データソースビュー、データモデル、およびレポートビルダー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、OrderDate、および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

1 に答える 1

4

レポートモデルを処理するときに、パフォーマンスの問題が発生することがあります。これが、レポートモデルがすべてのユーザーにロールアウトしてすべてのレポートを置き換えることを意図していない理由の1つです。レポートモデルの背後にあるセマンティッククエリエンジンによって生成されたクエリは調整可能ではなく、多くの場合、自分で作成する方法とはまったく異なります。

エンジンは基本的に、名前付きクエリをビューとして扱い、ビューと同じように、基になるクエリに展開します。これは、データベースを直接オーバーレイするモデルを構築するときにしばしば問題になります。

私の観点からすると、理想的な状況は、別のデータベース(場合によってはデータウェアハウス)を別のサーバーに格納することです。このdwは、読み取りパフォーマンスのために最適化できるようにフラット化されます。次に、これらのテーブルをデータソースビューで直接使用でき、モデルの背後にあるセマンティッククエリエンジンがより適切なクエリを実行できるようになります。

この理想は、経済的またはその他の制約のためにしばしば不可能です。ベーステーブルから、モデルをサポートするためにレポート用に最適化できる新しいテーブルセットに、多かれ少なかれETLを使用してみてください。

于 2010-09-03T17:33:01.717 に答える