2016-09-28 2 views
3

以下のクエリのソースについてのヘルプを探しています。このクエリはDynamicsAXデータベースに対して5分ごとに実行され、平均実行時間は25秒です。私はそれが私たちのManagementReporter dbsをホストする私たちのSSRSサーバーから来ていることを知っています、私はそれを実行する仕事を見つけることができないので、私はそれがアプリのいくつかの種類から来ている疑いがあります。この特定のクエリは誰が実行していますか?

パフォーマンスを改善できるかどうかを確認したいと思います。統計を見ると、modelSecurityRoleとSubRoleは重い打者です。

ユーザー生成クエリではないと仮定すると、コースのこの実行時間は同じですか、それとも最適化できるものですか?

IO統計:

... 
Table 'Workfile'. Scan count 16, logical reads 20288, physical reads 2516, read-ahead reads 17772, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ModelSecurityRole'. Scan count 805305, logical reads 2316945, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ModelSecuritySubRole'. Scan count 56649, logical reads 1501880, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
... 

問合せ:

select T.USERKEY, T.NAME, T.ALIAS, T.DOMAIN, T.SECURITYID, MAX(T.GENERALLEDGERROLETYPE) GENERALLEDGERROLETYPE, T.COMPANYKEY, T.ISENABLED 
from (
    select UI.RECID USERKEY, UI.NAME, UI.NETWORKALIAS ALIAS, UI.NETWORKDOMAIN DOMAIN, SID SECURITYID, 
     CASE st.AOTNAME 
      WHEN 'SysSecSecurityMaintain' THEN 5 
      WHEN 'LedgerBalanceSheetDimMaintain' THEN 4 
      WHEN 'LedgerFinancialJournalReportBGenerate' THEN 3 
      WHEN 'LedgerBalanceSheetDimPrintGenerate' THEN 3 
      WHEN 'LedgerViewFinancialStatement' THEN 2 
     END GENERALLEDGERROLETYPE, l.RECID COMPANYKEY, UI.ENABLE ISENABLED 
     from [MicrosoftDynamicsAX]..USERINFO UI 
     inner join [MicrosoftDynamicsAX]..SECURITYUSERROLE sur on UI.ID = sur.USER_ and UI.PARTITION = sur.PARTITION 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYROLE sr on sur.SECURITYROLE = sr.RECID 
      and (GETUTCDATE() between sur.VALIDFROM and sur.VALIDTO OR 
       (sur.VALIDFROM = '1/1/1900' and sur.VALIDTO = '1/1/1900')) 
     inner join [MicrosoftDynamicsAX]..SECURITYUSERROLECONDITION c on c.SECURITYUSERROLE = sur.RECID and c.PARTITION = sur.PARTITION 
     inner join (SELECT T1.SECURITYTASK AS SECURITYTASK 
         ,T2.SECURITYROLE AS SECURITYROLE 
        FROM [MicrosoftDynamicsAX_Model]..SECURITYROLETASKGRANT T1 
        CROSS JOIN [MicrosoftDynamicsAX_Model]..SECURITYROLEEXPLODEDGRAPH T2 
        WHERE (T1.SECURITYROLE = T2.SECURITYSUBROLE) 
        GROUP BY T1.SECURITYTASK 
         ,T2.SECURITYROLE) v on v.SECURITYROLE = sr.RECID 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYTASKEXPLODEDGRAPH g on g.SECURITYTASK = v.SECURITYTASK 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYTASK st on g.SECURITYSUBTASK = st.RECID 
     inner join (Select l.RECID, l.PARTITION, CI.DATAAREA from [MicrosoftDynamicsAX]..LEDGER l 
      inner hash join [MicrosoftDynamicsAX]..DIRPARTYTABLE CI on CI.PARTITION = l.PARTITION and l.PRIMARYFORLEGALENTITY = CI.RECID) l on UI.PARTITION = l.PARTITION and l.DATAAREA = c.DATAAREA 
    Where 
     UI.EXTERNALUSER = 0 AND 
     UI.[SID] != '' AND 
     UI.[ACCOUNTTYPE] = 0 AND 
     sur.ASSIGNMENTSTATUS = 1 AND 
     st.AOTNAME in (
     'SysSecSecurityMaintain', 
     'LedgerBalanceSheetDimMaintain', 
     'LedgerFinancialJournalReportBGenerate', 
     'LedgerBalanceSheetDimPrintGenerate', 
     'LedgerViewFinancialStatement') 
    union all 
    -- get users and their assigned tasks for all companies where the task hasn't been constrained to a company 
    select UI.RECID USERKEY, UI.NAME, UI.NETWORKALIAS ALIAS, UI.NETWORKDOMAIN DOMAIN, SID SECURITYID, 
     CASE st.AOTNAME 
      WHEN 'SysSecSecurityMaintain' THEN 5 
      WHEN 'LedgerBalanceSheetDimMaintain' THEN 4 
      WHEN 'LedgerFinancialJournalReportBGenerate' THEN 3 
      WHEN 'LedgerBalanceSheetDimPrintGenerate' THEN 3 
      WHEN 'LedgerViewFinancialStatement' THEN 2 
     END GENERALLEDGERROLETYPE, l.RECID COMPANYKEY, UI.ENABLE ISENABLED 
     from [MicrosoftDynamicsAX]..USERINFO UI 
     inner join [MicrosoftDynamicsAX]..SECURITYUSERROLE sur on UI.ID = sur.USER_ and UI.PARTITION = sur.PARTITION 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYROLE sr on sur.SECURITYROLE = sr.RECID 
      and (GETUTCDATE() between sur.VALIDFROM and sur.VALIDTO OR 
       (sur.VALIDFROM = '1/1/1900' and sur.VALIDTO = '1/1/1900')) 
     inner join (SELECT T1.SECURITYTASK AS SECURITYTASK 
         ,T2.SECURITYROLE AS SECURITYROLE 
        FROM [MicrosoftDynamicsAX_Model]..SECURITYROLETASKGRANT T1 
        CROSS JOIN [MicrosoftDynamicsAX_Model]..SECURITYROLEEXPLODEDGRAPH T2 
        WHERE (T1.SECURITYROLE = T2.SECURITYSUBROLE) 
        GROUP BY T1.SECURITYTASK 
         ,T2.SECURITYROLE) v on v.SECURITYROLE = sr.RECID 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYTASKEXPLODEDGRAPH g on g.SECURITYTASK = v.SECURITYTASK 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYTASK st on g.SECURITYSUBTASK = st.RECID 
     inner join (Select l.RECID, l.PARTITION from [MicrosoftDynamicsAX]..LEDGER l 
      inner hash join [MicrosoftDynamicsAX]..DIRPARTYTABLE CI on CI.PARTITION = l.PARTITION and l.PRIMARYFORLEGALENTITY = CI.RECID) l on UI.PARTITION = l.PARTITION 
    Where 
     UI.EXTERNALUSER = 0 AND 
     UI.[SID] != '' AND 
     UI.[ACCOUNTTYPE] = 0 AND 
     sur.ASSIGNMENTSTATUS = 1 AND 
     st.AOTNAME in (
     'LedgerBalanceSheetDimMaintain', 
     'LedgerFinancialJournalReportBGenerate', 
     'LedgerBalanceSheetDimPrintGenerate', 
     'LedgerViewFinancialStatement', 
     'SysSecSecurityMaintain') 
     and not exists (select 1 from SECURITYUSERROLECONDITION c where c.SECURITYUSERROLE = sur.RECID and c.PARTITION = sur.PARTITION) 
    union all 
    -- get all administrators for all companies where the admin's aren't limited to specific companies 
    select UI.RECID, UI.NAME, UI.NETWORKALIAS, UI.NETWORKDOMAIN, SID, 5 RoleType, l.RECID, UI.ENABLE ISENABLED 
     from [MicrosoftDynamicsAX]..USERINFO UI 
     inner join [MicrosoftDynamicsAX]..SECURITYUSERROLE sur on UI.ID = sur.USER_ and UI.PARTITION = sur.PARTITION 
     inner join [MicrosoftDynamicsAX_Model]..SECURITYROLE sr on sr.RECID = sur.SECURITYROLE 
      and (GETUTCDATE() between sur.VALIDFROM and sur.VALIDTO OR 
       (sur.VALIDFROM = '1/1/1900' and sur.VALIDTO = '1/1/1900')) 
     inner join (Select l.RECID, l.PARTITION from [MicrosoftDynamicsAX]..LEDGER l 
      inner hash join [MicrosoftDynamicsAX]..DIRPARTYTABLE CI on CI.PARTITION = l.PARTITION and l.PRIMARYFORLEGALENTITY = CI.RECID) l on UI.PARTITION = l.PARTITION 
     where 
      UI.EXTERNALUSER = 0 AND 
      UI.[SID] != '' AND 
      UI.[ACCOUNTTYPE] = 0 AND 
      sur.ASSIGNMENTSTATUS = 1 AND 
      AOTNAME in ('SysSecSecurityAdministrator') 
    ) 
    T 
    Group by T.USERKEY, T.NAME, T.ALIAS, T.DOMAIN, T.SECURITYID, T.COMPANYKEY, T.ISENABLED 
    order by T.COMPANYKEY 

私はこれらのクエリが管理レポーターから生成され、あなたが変更することはできませんSQL 2012の最新のビルドに

+0

私はそれが経営幹部のサービスの1つだと思います。 mgmtレポータサーバを見ると、 'Management ... 'で始まる2つのサービスが実行されているのが見えます。これをどのように修正するかはわかりません。私はそれがユーザー/ロールと元帳データを取得すると思います。 –

答えて

4

を使用していますそれら。 [MicrosoftDynamicsAX]データベースにある表に対してAOTに索引を追加できますが、[MicrosoftDynamicsAX_Model]データベースにある表には索引を追加できません。

これは、チューニングオプションが非常に限られていることを意味し、このクエリは複数回にわたって複数秒かかると見ていますが、IOの量は私には分かりません。

物事のカップルは、しかし心に来る:

は、あなたの統計情報が最新であり、あなたのインデックスがあまりにもモデルデータベースのデフラグされていることを確認してください。通常の保守計画、SQLステートメントまたはOptimize-AXModelStoreを使用してこれを行うことができます。

最新のCU(管理リポジトリにはAXとは別のCUがあります)の最新版であることを確認してください。修正内容は必ずしもうまく文書化されているとは限りませんが、

あなたはSQL 2014を使用していませんが、将来の読者にはこの情報をここに追加します。私はこのクエリがSQL 2014のnew Cardinality Estimatorでいくつかの機会に間違っているのを見ました。したがって、SQL 2014を使用している人は、RTMバージョン以降に多くの修正がリリースされているため、SQL Serverが最新のCUに最新のものであることを確認してください。それでもまだSQL2014で動作するようにクエリを取得できない場合は、このクエリを元のカーディナリティ推定値を使用するように戻すことができます。

EXEC sp_create_plan_guide @name = N'[Management Reporter guide]', @stmt = N'<the exact text of the query, whitespace and linebreaks included>', @hints = N' OPTION(QUERYTRACEON 9481)' 
GO 

2014年の問題の症状は、あなたが説明したものではなく、数分間実行され、膨大なCPUを消費しました。

+1

私はそれを3つの中間クエリに絞り込みました。問題のステートメントは最後の結合句のサブクエリのように見えます。= '[MicrosoftDynamicsAX]からl.RECID、l.PARTITIONを選択してください.. LEDGER l 内部ハッシュ[MicrosoftDynamicsAX] .. CI.PARTITION = l.PARTITIONおよびl.PRIMARYFORLEGALENTITY = CI.RECID'上のDIRPARTYTABLE CIに参加します。 「ハッシュ」ヒントを削除すると、全体的なクエリがサブ秒で完了します。 – Greg

+0

SQL Server 2012にも同じ問題があります。@ Gregの場合と同様に、私はハッシュ結合のヒントを削除することで問題が解決されることを発見しました。ただし、変更するコードはありません。マイクロソフトのアプリケーションにあります。 –

+2

@MarkFreemanサポートチケットを発行することはできますが、修正方法を知っていれば、新しい累積的な更新を待つ間に自分で修正することができます –

関連する問題