2017-04-24 85 views
0

下面提到的查詢針對有大量記錄的表運行 - 最高可達22029464 ....並且這在平均執行時間約爲20-25分鐘。是否有任何優化或重寫這個不同的範圍。所需的索引上的所有表中,查詢計劃表現出不缺少指標要求SQL Server查詢優化 - MultiJoins在2000萬條記錄中的表

SELECT stg.* 
    FROM dbo.s_NIIT_ResultValues stg 
    WHERE stg.resultId IN (SELECT resultId 
           FROM  Data_NIIT.dbo.NIIT_Results) 
      AND (stg.resultIntValueId IS NULL 
        OR stg.resultIntValueId IN (
        SELECT resultIntValueId 
        FROM  Data_NIIT.dbo.NIIT_ResultIntValues) 
       ) 
      AND (stg.resultBoolValueId IS NULL 
        OR stg.resultBoolValueId IN (
        SELECT resultBoolValueId 
        FROM  Data_NIIT.dbo.NIIT_ResultBoolValues) 
       ) 
      AND (stg.resultStringValueId IS NULL 
        OR stg.resultStringValueId IN (
        SELECT resultStringValueId 
        FROM  Data_NIIT.dbo.NIIT_ResultStringValues) 
       ) 
+1

爲什麼不只是加入toResultIntValues,ResultBoolValues,ResultStringValues?似乎它會更加高效,基本上是一樣的,而且很容易閱讀和理解。 – pmbAustin

+1

查詢計劃,表格定義以及這些表格上的所有索引和鍵。 「*所有表上都存在必需的索引,查詢計劃顯示沒有缺失索引需求*」是一個錯誤的結論,查詢計劃的建議在這個特定的決定中遠未完成。 – RBarryYoung

回答

0

我的第一個問題是「爲什麼你會在同一時間需要這麼多記錄?」爲什麼不使用分頁。

其次使用「with(nolock)」並且不要使用「*」,提及列名。

第三,我會將我的連接更改爲離開或使用「存在子句」。

SELECT stg.mentioncolumnname,stg.mentioncolumnname1 
    FROM dbo.s_NIIT_ResultValues stg with (nolock) 
where exists(SELECT resultId 
       FROM Data_NIIT.dbo.NIIT_Results with (nolock) 
       where resultId=stg.resultId) 
and exists(

    SELECT resultBoolValueId 
        FROM Data_NIIT.dbo.NIIT_ResultBoolValues with (nolock) 
        where ((stg.resultBoolValueId IS NULL) or (resultBoolValueId=stg.resultBoolValueId)) 
) 
and exists(

    SELECT resultStringValueId 
        FROM Data_NIIT.dbo.NIIT_ResultStringValues with (nolock) 
        where ((stg.resultStringValueId IS NULL) or (resultStringValueId=stg.resultStringValueId)) 
) 

另一種方式:有3個連接表dbo.s_NIIT_ResultValues。

在3 diff編輯器中只加入一個包含dbo.s_NIIT_ResultValues的表,並查看哪些結果集是最小值並告訴我們。