web-dev-qa-db-ja.com

SSRS 2014-Management Studioで正常に実行されているクエリ-レポートのタイムアウト-トラブルシューティングの方法

レポートサービス2014で問題が発生しました-レポートのすべてのクエリはManagement Studioから正常に実行されていましたが、レポートの実行中にタイムアウトしました。

これはユーザーからのメッセージです:

enter image description here

ロードでスタックするSSRS 2014レポートのトラブルシューティングを行うにはどうすればよいですか?

sSRSログはどこにありますか?

レポートには3つのデータセットがあり、クエリを削除してSSMSSで実行すると、すべて正常に実行されます。

このレポートサービスサーバーにはサービスのみがあり、データベース(ReportServerなど)は別のサーバー上にありますが、それは問題ではなく、数か月間実行されています。

これはレポートのクエリです:

USE Product
declare @SeasonId int;set @SeasonId = 16

SELECT DISTINCT 
        EDP [EDP],
        '-' [PO],
        NULL [PO Type Initial/ Repeat],
        NULL [PO Status Open/ Close],
        s.StyleCode + c.ColourCode + sz.SizeCode [SKU] ,
        StyleDesc [Style Description] ,
        s.StyleCode [Style] ,
        c.ColourCode [Option] ,
        SizeCode [Size] ,
        NULL [MPLAN Segment Code],
        SeasonDesc [Season],
        DepartmentDesc [Department],
        CategoryDesc [Category],
        NULL [ALL Season, SPR Only, SUM Only, INTERNET Only],
        NULL [Fabric Type],
        NULL [Garment Composition],
        NULL [Country Of Origin],
        NULL [MID Code],
        NULL [HTS Code],
        0.00 [Cost to use],
        NULL [Exception Flag],
        NULL [Duty Rate]
FROM    [Product].[dbo].[Style] s
        JOIN Product.dbo.StyleDetail sd ON s.StyleID = sd.StyleID
        JOIN [Product].[dbo].[Category] ct ON s.CategoryID = ct.CategoryID
        JOIN [Product].[dbo].[Department] d ON ct.DepartmentID = d.DepartmentID
        JOIN [Product].[dbo].[Segment] sg ON d.SegmentID = sg.SegmentID --
        JOIN [Product].[dbo].[Item] i ON s.styleid = i.styleid
        JOIN [Product].[dbo].[ItemColour] ic ON i.itemid = ic.itemid
        JOIN [Product].[dbo].[Colour] c ON ic.colourid = c.colourid
        JOIN [Product].[dbo].[ItemSize] isz ON i.itemid = isz.itemid
        JOIN [Product].[dbo].[Size] sz ON isz.sizeid = sz.sizeid
        JOIN [Product].[dbo].[SeasonItem] si ON i.itemid = si.itemid
        JOIN [Product].[dbo].[Season] se ON se.seasonid = si.seasonid
        JOIN [product].[dbo].[ItemMPLANReference] pn ON pn.itemid = i.itemid
        JOIN [Product].[dbo].[Product_Staging_CategoryImportMap] ci ON ci.CategoryID = ct.CategoryID
        JOIN [SAPurchaseOrder].[dbo].[tblPO1Detail] pod ON pn.EDP = pod.strItemNo

WHERE se.seasonid IN (@SeasonId)
and EDP not in (SELECT skuEDP from USCarrier.dbo.WHDespatchSku)
ORDER BY 1

この問題は解決されました。どうやってやったのですか?

クエリプランを確認したところ、インデックスの欠落に気づきました。

USE [SAPurchaseOrder]
GO
CREATE NONCLUSTERED INDEX [idx_strItemNo]
ON [dbo].[tblPO1Detail] ([strItemNo])

GO

インデックスを追加した後、レポートは再び正常に機能し始めました。

実際に起こったと思うのは、SSRSがクエリ実行プランをキャッシュしていて、パラメータースニッフィングのケースがあったということです。インデックスを作成すると、プランはキャッシュから削除され、再コンパイルする必要がありました。

これは、この質問と非常に似ています: SQLはSSRSでは遅く実行されますが、SSMSでは速く実行されます

上記の質問から私が有用だと思う良いことの1つは、パラメーターの盗聴の可能性を排除する方法です。

コメントで説明したように、パラメーターを削除して、クエリがパラメータースニッフィングの影響を受けているかどうかを確認しましょう。

これを行うには、最初からSQLステートメントを作成します。 SSRSのほとんどのものは、SQLクエリを含む式にすることができるため、文字列として構築できます。パラメータを使用して、JOINを使用してカンマ区切りのリストに変換します。

質問は残ります:

ロードでスタックするSSRS 2014レポートのトラブルシューティングを行うにはどうすればよいですか?

sSRS 2014ログはどこにありますか?

2

実行ログを確認する必要があります。レポートサーバーデータベースには、ExecutionLog3というビューがあります。このビューを日付で照会し、ユーザーがレポートを実行した方法を見つけることができます。

USE [ReportServer]
GO

SELECT *
FROM dbo.ExecutionLog3 AS el
WHERE el.TimeStart >= '2016-08-02'
1
Arthur D

SSRS再現では、実際に3つの点を確認する必要があります。IISログ、SSRSログ、データベースのプロファイルを作成します。

IISログには、サイトにIIS問題がある場合に表示されます。おそらく問題ではありませんが、念のため確認しても問題はありません。接続に問題がある可能性があるため、IISアプリプールとログを確認して、これを除外してください。

Arthur Dが言及しているように、executionlog3ビューは、リクエストがレポートデータベースに到達したかどうかと、何が起こったかを示します。

上記の両方で問題が解決しない場合は、データベースをプロファイリングして、リクエストがデータベースに対して行っているかどうかを確認します。

0
Jason B.