2017-06-28 7 views
0

を使用して消費しているビューからデータを取得ビューが文で作成されたSQLサーバー2016でviewは非常に時間が私が作成したSQL Serverの

CREATE VIEW dbo.StockEOMonth 
AS 
    SELECT  CAST(StoreKey AS numeric(4, 0)) AS StoreKey, 
       DateKey, 
       SUM(StockValue) AS StockValue, 
       SUM(StockQuantity) AS StockQuantity 
    FROM   Stock 
    WHERE  CONVERT(date, CONVERT(varchar(10), DateKey)) = 
       EOMONTH(CONVERT(date, CONVERT(varchar(10), DateKey))) 
    GROUP BY DateKey, storekey 

ビュー自体ではなくストレートフォワードです。私はSUM()を使用する理由は、基になるテーブルStockに各商品の残高が含まれていますが、私は合計残高のみに興味があるため、月末の各店舗に合計StockQuantityStockValueの残高を返します各店舗ごとに)。

このビューは、単に4000個のレコードを返します。しかし、私は、クエリを使用する場合:

SELECT top(10) StockValue, StockQuantity 
FROM dbo.StockEOMonth 

クエリのみ10行を返すために13 かかりますが。

私はそのような些細なビューを最適化する方法がわかりません。誰にもアイデアはありますか?私は実際のテーブルとしてテーブルを作成することができましたが、可能であればviewとしたいと考えています。

私はSSMSと私はのためのデータソースとしてビューを使用するために始めましたインスタンスからErrorCode 3240034318を得ているSSASの両方でデータを取得するには遅さをexperiancedましEDIT

errorCodeがQuery TimeOutに関連していると思われるGroupを測定します。

+0

iはテストテーブルを作成し、すべてが答えるために細かい – Nico

答えて

1

WHERE句はSARGableではありません。あなたは、where句の左側に機能を削除する必要があります。フォーマットが動作しない場合は

WHERE DateKey = EOMONTH(DateKey) 

、それはDateKeyの形式に一致する権利上の機能を置きます。

CREATE NONCLUSTERED INDEX [ix_test] ON [stock] 
(
    [datekey] ASC 
) 
INCLUDE ( [StoreKey], 
    [StockValue], 
    [StockQuantity]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
+0

おかげで動作します:あなたはすでにインデックスがチューニングされていない場合は

、これを試してみてください。私はSARGableという言葉について知らなかった。私の場合、DateKeyのデータ型はnumeric(8,0)です。私は、 'DateKey = cast(convert(varchar、eomonth(CONVERT(date、CONVERT(varchar(10)、DateKey))、112)を数値(8,0))'にするためにwhere句を変更しようとしました。 SSMSは現時点でクエリを処理しています。私は何が起こるか見るでしょう – Cenderze

+0

答えは適切なインデックスを含むように更新されました。 – cloudsafe

関連する問題