Недостатки модели отчета. Нужен совет - PullRequest
2 голосов
/ 03 сентября 2010

Я пытаюсь помочь моим опытным пользователям получить больший доступ к нашим данным, чтобы мне не приходилось прерывать мою работу (играя в Pac-Man) 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, полный набор данных возвращается в любом случае.

Я что-то здесь не так делаю?

Есть ли лучший способ приблизиться к этому?

У других администраторов возникают проблемы с производительностью при использовании моделей отчетов?

1 Ответ

4 голосов
/ 03 сентября 2010

Иногда возникают проблемы с производительностью при работе с моделями отчетов. Это одна из причин того, что модели отчетов не предназначены для распространения среди всех ваших пользователей всех отчетов. Запросы, сгенерированные семантическим механизмом запросов, лежащим в основе моделей отчетов, не настраиваются и часто полностью НЕ соответствуют тому, как вы сами их пишете.

Движок по сути обрабатывает именованный запрос как представление, которое он расширяет до базового запроса, так же как и представление. Это часто является проблемой при построении модели, непосредственно накладывающей вашу базу данных.

Идеальная ситуация, с моей точки зрения, состоит в том, чтобы иметь отдельную базу данных (возможно, хранилище данных), которая предпочтительно размещается на отдельном сервере. Это dw будет выровнено так, что вы сможете оптимизировать его для производительности чтения. Затем вы можете использовать эти таблицы непосредственно в представлении источника данных, и механизм семантических запросов, лежащий в основе модели, сможет выполнять более качественные запросы.

Этот идеал часто невозможен из-за экономических или других ограничений. Не могли бы вы попытаться получить задание более или менее ETL из ваших базовых таблиц в новый набор таблиц, который вы могли бы оптимизировать для составления отчетов для поддержки вашей модели?

...