2011-08-09 18 views
2

私はAccessデータベースを書き直し中です。書き直す必要があるMS Accessクエリがあります。これらは基本的に次の2つのデータベースで使用され、データのカウント/合計で構成されます。次に、レポートのために合計を使用します。ほとんどのサブクエリは、このようなものです。複数行テーブル関数またはストアドプロシージャを使用する

これは書き換えが簡単で問題は発生しません。私の問題は、私は約20-30のこれらのクエリを書き直す必要があるということです。ユーザーが現在持っている要求の1つは、アカウントの数量と合計を構成するアカウントの一覧を取得するオプションを持つことです。だから、リストが欲しいので、私の20-30の質問は二重になりました。

だから私は、これは、彼らが

をしたい任意の特定の日のカウントまたはリストを提供することができるように設計するための最良の方法を決定しようとしています、私はこれを行うには、マルチステートメントの表関数を作成することを考えていましたが、私はそれが格納されたprocやビューや他のものよりも良いかどうかわからない

私は彼らが任意の日付で検索することができ、アカウントのリストまたはカウントを取得することができます次の関数を作成しました。

CREATE FUNCTION [udf_GeBreakdown] 
(
    @BusinessDate  datetime 
    , @ListOfAccounts bit 
) 
RETURNS @TableCount 
TABLE 
(
    Account int, ReasonName varchar(50), Amount money 
) 
AS 
BEGIN 

    DECLARE @PreviousDate smalldatetime 
    SET @PreviousDate = udf_GetNextImportDate(@BusinessDate, -1); 

    IF @ListOfAccounts = 0 
     BEGIN  
      INSERT INTO @TableCount 
      SELECT Count(Account), R.ReasonName, Sum(Amount) 
      FROM Debs.Resolved RS 
      INNER JOIN Debs.Reason R 
       ON RS.ReasonId = R.ReasonId 
      WHERE RS.DebitDate = @PreviousDate 
       AND RS.StatusId NOT IN (15, 17) 
      GROUP BY R.ReasonName 
     END 
    ELSE 
     BEGIN 
      INSERT INTO @TableCount 
      SELECT Account, R.ReasonName, Amount 
      FROM Debs.Resolved RS 
      INNER JOIN Debs.Reason R 
       ON RS.ReasonId = R.ReasonId 
      WHERE RS.DebitDate = @PreviousDate 
       AND RS.StatusId NOT IN (15, 17) 

     END 

    RETURN 
END 

これは、この方法または私はちょうど私がこれを照会するとき、私のカウント/合計を取得し、その後のアカウントのリストを提供し、必要がある場合はそれをやって時間の無駄であるかどうかはわかりません。私はいくつかの助けと方向を探しています。

答えて

1

このマルチステートメントUDFでは、パフォーマンスが問題になります。

あなたが書いた以上にシステムから読むと、私は次のようなindexed viewを作成しようとします。

CREATE VIEW V1 WITH SCHEMABINDING AS 
SELECT RS.DebitDate, Account, R.ReasonName, Amount 
FROM Debs.Resolved RS 
INNER JOIN Debs.Reason R 
    ON RS.ReasonId = R.ReasonId 
WHERE RS.StatusId NOT IN (15, 17) 

CREATE INDEX X on V1 -- based on usage 

次に、SPまたは単一ステートメントUDFで次のステートメントを使用して、アカウントの一覧を取得します。ステートメントは、その時点でかなり簡単になります。お使いのシステムは、集中的な書き込みであれば、私はまだこれをしようとするだろう

SELECT Count(Account), ReasonName, Sum(Amount) 
FROM V1 with(noexpand) 
GROUP BY DebitDate, ReasonName -- or use DebitDate in the where clause 

(ビューでその機能を保存しない...ここにあなたの前日ロジックを実行する必要があります)、しかし、このインデックス付きビューが遅くなりますスキーマにバインドされているテーブルに挿入します。索引付けビューはコストがかかりますので、通常のビューを作成するだけで十分です。

関連する問題