2

SQLユニオンが3つのユニオンすべてのクエリを持つすべてのクエリがあります。クエリの実行時間は、クエリにテキスト列CAST(c.getQuestionId AS VARCHAR(300))を追加した後に大幅に変更されました。使用されているデータベースはSQL Server 2014です。パフォーマンスチューニングの専門家、助けてください。以下のSQLクエリでテキスト列のパフォーマンスを向上させる方法

JcccustomersAssessmentProxyに作成された3つのインデックスがあります。これは8000万レコードのテーブルです。インデックスの明示的な使用は唯一の第三のクエリに記載されているだけ (すなわち(NOLOCK, INDEX=IX_AssessmentProxy_myJcAssessmentContext))myJcAssessmentContext

上の非クラスタ化インデックスがあり

ありgetmycoordtoyplanver

上の非クラスタ化インデックスがありますgetMyEventItemの非クラスタ化インデックス

SELECT  ass.P_KEY 
      ,ass.SS_CODE 
      ,CAST(evp.EVENT_SSID AS VARCHAR(11)) AS EVENT_SSID 
      ,CAST(QUESTIONNUMBER AS VARCHAR(3))        AS EVENT_NO 
      ,CAST(ISNULL(CAST(TEMPLATEVERSION AS VARCHAR), 0) AS INT)  AS TEMPLATEVERSION 
      ,ISNULL(CAST(TEMPLATENAME AS VARCHAR(50)), ' ')     AS TEMPLATENAME 
      ,evp.ASS_DATE 
      ,ISNULL(ANSWERNUMBER, 0)          AS ANSWER_NO 
      ,ass.CASE_SSID 
      ,ass.RE_SSID 
      ,ass.RE_DATE 
      ,ass.EPISODE_SSID 
      ,ass.[SERVICE] 
      ,ass.SERVICE_DESC 
      ,ass.TAM_KEY 
      ,ass.PRv_KEY 
      ,CAST(QUESTIONNUMBER AS VARCHAR(3))     AS QUESTION_NO 
      ,ISNULL(CONVERT(VARCHAR(100), REPLACE(REPLACE(CAST(QUESTIONTEXT AS VARCHAR(650)), char(10), ''), char(13), ' ')), ' ') AS QUESTION_TEXT 
      ,ISNULL(CAST(ANSWER AS VARCHAR(125)), ' ')   AS ANSWER_TEXT 
      ,a.MyAssessment          AS ASSESSMENT_SSID 
----------------------------------------------------------------------------------------- 

      ,CAST(RIGHT(a.getMyCoordtoyPlanVer, 10) AS INT)  AS toy_PLAN_VERSION_SSID  
      ,CAST(RIGHT(a.myJcAssessmentContext, 10) AS INT)  AS CONTEXT_FORM_SSID 
-----------------------------------------------------------------------------------------   
      ,ass.RECORD_DATE 
           **,CAST(a.getQuestionId AS VARCHAR(300))     AS QUESTION_ID /*NEW Text Column ,this remove the parallelism*/** 
FROM  SourceFeed.dbo.JcccustomersAssessmentProxy AS a WITH(NOLOCK) 
      INNER JOIN 
      TEMP_DATABASE.dbo.jsystemReport_AllEventItems_AllPersons evp WITH(NOLOCK) 
      ON a.getMyEventItem = evp.oid 


      INNER JOIN 
      TEMP_DATABASE.dbo.jsystemAssessment      ass WITH(NOLOCK) 
      ON evp.getcustomersId = ass.customersID 
      AND evp.EVENT_SSID = ass.EVENTID 


UNION ALL 

SELECT  ass.P_KEY 
      ,ass.SS_CODE 
      ,CAST(csp.ENT_SSID AS VARCHAR(11)) AS EVENT_SSID 
      ,CAST(jcc.QUESTIONNUMBER AS VARCHAR(3)) AS EVENT_NO 
      ,CAST(ISNULL(CAST(CAST(jcc.TEMPLATEVERSION AS VARCHAR) AS VARCHAR), 0) AS INT) AS TEMPLATEVERSION 
      ,ISNULL(CAST(jcc.TEMPLATENAME AS VARCHAR(50)), ' ') AS TEMPLATENAME 
      ,csp.ASSESSMENT_DATE 
      ,ISNULL(jcc.ANSWERNUMBER, 0) AS ANSWER_NO 
      ,ass.CASE_SSID 
      ,ass.REF_SSID 
      ,ass.RE_DATE 
      ,ass.EPISODE_SSID 
      ,ass.[SERVICE] 
      ,ass.SERVICE_DESC 
      ,ass.TEAM_KEY 
      ,ass.PROVIDER_KEY 
      ,CAST(ISNULL(jcc.QUESTIONNUMBER, 0) AS VARCHAR(3)) AS QUESTION_NO 
      ,isnull(CONVERT(VARCHAR(100), replace(replace(CAST(jcc.QUESTIONTEXT AS VARCHAR(650)), char(10), ''), char(13), ' ')), ' ') AS QUESTION_TEXT 
      ,ISNULL(CAST(jcc.ANSWER AS VARCHAR(125)), ' ') AS ANSWER_TEXT 
      ,jcc.MyAssessment AS ASSESSMENT_SSID 
----------------------------------------------------------------------------------------- 

      ,CAST(RIGHT(jcc.getMyCoordtoyPlanVer, 10) AS INT)  AS toy_PLAN_VERSION_SSID  
      ,CAST(RIGHT(jcc.myJcAssessmentContext, 10) AS INT)  AS CONTEXT_FORM_SSID 
-----------------------------------------------------------------------------------------   
      ,ass.RECORD_DATE 
           **,CAST(jcc.getQuestionId AS VARCHAR(300))     AS QUESTION_ID /*NEW Text Column ,this remove the parallelism*/** 
FROM  TEMP_DATABASE.dbo.jsystemReport_toySpell    csp WITH(NOLOCK) 
      INNER JOIN 
      TEMP_DATABASE.dbo.jsystemAssessment      ass WITH(NOLOCK) 
      ON csp.getcustomersId = ass.customersID 
      AND csp.EVENT_SSID = ass.EVENTID 
      LEFT OUTER JOIN 
      SourceFeed.dbo.JcccustomersAssessmentProxy jcc WITH(NOLOCK) 
      ON csp.OID = jcc.getmycoordtoyplanver 

WHERE  NOT EXISTS (SELECT tp1.OID 
         FROM TEMP_DATABASE.dbo.AssessmentTransferPart1 tp1 
         WHERE tp1.OID = jcc.OID) 

UNION ALL 

SELECT  ass.P_KEY 
      ,ass.SS_CODE 
      ,CAST(a.EVENT_SSID AS VARCHAR(11)) AS EVENT_SSID 
      ,CAST(CAST(C.QUESTIONNUMBER AS INT) AS CHAR(3)) AS EVENT_NO 
      ,CAST(ISNULL(CAST(C.TEMPLATEVERSION AS VARCHAR), 0) AS INT) AS TEMPLATEVERSION 
      ,ISNULL(CAST(C.TEMPLATENAME AS VARCHAR(50)), ' ') AS TEMPLATENAME 
      ,a.ASSESSMENT_DATE 
      ,ISNULL(C.ANSWERNUMBER, 0) AS ANSWER_NO 
      ,ass.CASE_SSID 
      ,ass.REL_SSID 
      ,ass.REAL_DATE 
      ,ass.EPISODE_SSID 
      ,ass.[SERVICE] 
      ,ass.SERVICE_DESC 
      ,ass.TEAM_KEY 
      ,ass.PROVIDER_KEY 
      ,CAST(ISNULL(CAST(C.QUESTIONNUMBER AS INT), 0) AS VARCHAR(3)) AS QUESTION_NO 
      ,isnull(CONVERT(VARCHAR(100), CAST(C.QUESTIONTEXT AS VARCHAR(650))), ' ') AS QUESTION_TEXT 
      ,ISNULL(CAST(C.ANSWER AS VARCHAR(125)), ' ') AS ANSWER_TEXT 
      ,a.MyAssessment AS ASSESSMENT_SSID 
----------------------------------------------------------------------------------------- 

      ,CAST(RIGHT(C.getMyCoordtoyPlanVer, 10) AS INT)  AS toy_PLAN_VERSION_SSID  
      ,CAST(RIGHT(C.myJcAssessmentContext, 10) AS INT)  AS CONTEXT_FORM_SSID 
-----------------------------------------------------------------------------------------   
      ,ass.RECORD_DATE 
           **,CAST(c.getQuestionId AS VARCHAR(300))**     AS QUESTION_ID /*NEW Text Column ,this remove the parallelism*/ 
FROM  SourceFeed.dbo.toyClusterReviewAssessment  B WITH(NOLOCK) 
      INNER JOIN 
      SourceFeed.dbo.JcccustomersAssessmentProxy  C WITH(NOLOCK, INDEX=IX_AssessmentProxy_myJcAssessmentContext) 
      ON B.myJCJccUserFormContext = C.myJcAssessmentContext 
      INNER JOIN 
      SourceFeed.dbo.JcccustomersAssessmentScoreProxy D WITH(NOLOCK) 
      ON B.myJCJccUserFormContext = D.myJcAssessmentContext 


      INNER JOIN 
      TEMP_DATABASE.dbo.jsystemReport_toyClusterReviewEvent_AllPersons A WITH(NOLOCK) 
      ON a.myAssessment = B.oid 
      INNER JOIN 
      TEMP_DATABASE.dbo.jsystemAssessment    ass WITH(NOLOCK) 
      ON a.getcustomersId = ass.customersID 
      AND a.EVENT_SSID = ass.EVENTID 
WHERE  NOT EXISTS (SELECT OID 
         FROM (SELECT  tp1.OID 
            FROM TEMP_DATABASE.dbo.AssessmentTransferPart1 tp1 
            UNION ALL 
            SELECT tp2.OID 
            FROM TEMP_DATABASE.dbo.AssessmentTransferPart2 tp2) jcc 
         WHERE jcc.OID = C.OID) 

ここにはlink to the actual execution planがあります。ここで(NOLOCK、INDEX = IX_AssessmentProxy_GETMYCOORDCAREPLANVER)でJccClientAssessmentProxy jccにインデックスを追加した後


the new execution planあります。

+1

追加したテキスト列はどれですか? SELECT句に1つの列を追加するだけで、クエリが遅くなりましたか?あなたはより具体的でなければなりません、これはあなたの質問があまり分かりません。おそらくSQL Fiddleにテーブル構造などを追加してください。 –

+0

getQuestionIdは列です – user1254579

+0

太字などのマークアップはフォーマットされたコードブロック内では機能しません。 –

答えて

1

問題の一部です:

,CAST(a.getQuestionId AS VARCHAR(300)) AS QUESTION_ID 
    FROM cnlPjccR_Report.dbo.JccClientAssessmentProxy AS a 
     WITH(NOLOCK,INDEX=IX_AssessmentProxy_getMyEventItem) 
    INNER JOIN ... 

と問題があなたのUNION ALLサブクエリの二つに繰り返されます。

あなたの実行計画は高価を示しますKey lookups

第二の方法は、あなたが、少なくとも 満たすクエリ全体またはキーのルックアップを排除することを「カバーするインデックス」を作成することができますかどうかを確認することです。 「カバーインデックスは、」単にクエリ全体を満たすか、私たちの場合はどちらかに必要な すべての列を持つ非クラスタ化インデックスで、 は、キーのルックアップ操作を不要とします。 1つの課題は、キールックアップを生成している列のリストを にすることです。 キーを右クリックして[プロパティ]を選択すると、SQL Server Management Studio(SSMS)で を実行できます。次に、[Properties]ウィンドウで[Output List]行を探して、省略記号ボタンをクリックします。 これは、キールックアップが探しているすべての列 のリストを含むウィンドウを開きます(下記参照)。このリストを使用して、 がクエリまたはキー「 ルックアップ」を「カバーする」インデックスを作成するかどうか、および作成する方法を決定するのに役立ちます。あなたのケースでは

次の列は、被覆インデックスを作成するために含まれshoud:

[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].answer; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].answerNumber; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].getMyCoordCarePlanVer; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].getQuestionId; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].myAssessment; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].myJcAssessmentContext; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].questionNumber; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].questionText; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].templateName; 
[cnlPjccR_Report].[dbo].[JccClientAssessmentProxy].templateVersion 

おそらくあなたのインデックスがgetQuestionId列が含まれていませんでしたし、その事実があなたのクエリ実行プランにKey lookup遅くかRID lookupを作成しました。

also hereまたはthis answerを参照してください。

関連する問題