2016-12-08 7 views
1

を実行するのに時間がかかります200件中テーブルに220kのエントリがあれば(そしてカウント!)、フィルタリングと行の番号付けにはかなりの時間(> 30秒)がかかります。は次のように私は定義されたデバッグメッセージを含むテーブルを持っている

結果のページを取得するプロセスをスピードアップするためにできることはありますか?

EDIT:Gordonが提案したようにVARCHAR(MAX)に切り替えました。しかし、これは物事をスピードアップしませんでした。次のようにクエリの結果として実行計画がある(私はASCII-アートなどのグラフィックスを再描画しようとする):

         Sequence Project      Clustered Index Scan 
    SELECT <- Sort <- Filter <- Top <- (Compute Scalar) <- Segment <- Filter <- [debug].[PK_debug] 
Cost: 0%  26%  0%  0%   0%    0%   2%   71% 

またはXMLで

は:

<?xml version="1.0" encoding="utf-16"?> 
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="12.0.2569.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="4" StatementEstRows="16.4317" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="120" StatementSubTreeCost="0.0438369" StatementText="SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID DESC) AS RowNum, * FROM debug WHERE message LIKE @Filter) AS tbl WHERE RowNum &gt; (@Page*200-200) AND RowNum &lt;= (@Page * 200) ORDER BY ID DESC" StatementType="SELECT" QueryHash="0x535D30B424597DBB" QueryPlanHash="0x17ABB516DFF1A1A7" RetrievedFromCache="true"> 
      <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 
      <QueryPlan DegreeOfParallelism="0" NonParallelPlanReason="EstimatedDOPIsOne" MemoryGrant="1024" CachedPlanSize="32" CompileTime="4" CompileCPU="4" CompileMemory="248"> 
      <MemoryGrantInfo SerialRequiredMemory="512" SerialDesiredMemory="672" RequiredMemory="512" DesiredMemory="672" RequestedMemory="1024" GrantWaitTime="0" GrantedMemory="1024" MaxUsedMemory="56" /> 
      <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="256000" EstimatedPagesCached="16000" EstimatedAvailableDegreeOfParallelism="1" /> 
      <RelOp AvgRowSize="4055" EstimateCPU="0.000207573" EstimateIO="0.0112613" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="16.4317" LogicalOp="Sort" NodeId="0" Parallel="false" PhysicalOp="Sort" EstimatedTotalSubtreeCost="0.0438369"> 
       <OutputList> 
       <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
       <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
       <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
       <ColumnReference Column="Expr1002" /> 
       </OutputList> 
       <MemoryFractions Input="1" Output="1" /> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRebinds="1" ActualRewinds="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <Sort Distinct="false"> 
       <OrderBy> 
        <OrderByColumn Ascending="false"> 
        <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
        </OrderByColumn> 
       </OrderBy> 
       <RelOp AvgRowSize="4055" EstimateCPU="8.8E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="16.4317" LogicalOp="Filter" NodeId="1" Parallel="false" PhysicalOp="Filter" EstimatedTotalSubtreeCost="0.0323681"> 
        <OutputList> 
        <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
        <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
        <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
        <ColumnReference Column="Expr1002" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
        </RunTimeInformation> 
        <Filter StartupExpression="false"> 
        <RelOp AvgRowSize="4055" EstimateCPU="1E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="100" LogicalOp="Top" NodeId="2" Parallel="false" PhysicalOp="Top" EstimatedTotalSubtreeCost="0.0322801"> 
         <OutputList> 
         <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
         <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
         <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
         <ColumnReference Column="Expr1002" /> 
         </OutputList> 
         <RunTimeInformation> 
         <RunTimeCountersPerThread Thread="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
         </RunTimeInformation> 
         <Top RowCount="false" IsPercent="false" WithTies="false"> 
         <TopExpression> 
          <ScalarOperator ScalarString="CASE WHEN CONVERT_IMPLICIT(bigint,[@Page]*(200),0) IS NULL OR CONVERT_IMPLICIT(bigint,[@Page]*(200),0)&lt;(0) THEN (0) ELSE CONVERT_IMPLICIT(bigint,[@Page]*(200),0) END"> 
          <IF> 
           <Condition> 
           <ScalarOperator> 
            <Logical Operation="OR"> 
            <ScalarOperator> 
             <Compare CompareOp="IS"> 
             <ScalarOperator> 
              <Identifier> 
              <ColumnReference Column="ConstExpr1007"> 
               <ScalarOperator> 
               <Convert DataType="bigint" Style="0" Implicit="true"> 
                <ScalarOperator> 
                <Arithmetic Operation="MULT"> 
                 <ScalarOperator> 
                 <Identifier> 
                  <ColumnReference Column="@Page" /> 
                 </Identifier> 
                 </ScalarOperator> 
                 <ScalarOperator> 
                 <Const ConstValue="(200)" /> 
                 </ScalarOperator> 
                </Arithmetic> 
                </ScalarOperator> 
               </Convert> 
               </ScalarOperator> 
              </ColumnReference> 
              </Identifier> 
             </ScalarOperator> 
             <ScalarOperator> 
              <Const ConstValue="NULL" /> 
             </ScalarOperator> 
             </Compare> 
            </ScalarOperator> 
            <ScalarOperator> 
             <Compare CompareOp="LT"> 
             <ScalarOperator> 
              <Identifier> 
              <ColumnReference Column="ConstExpr1007"> 
               <ScalarOperator> 
               <Convert DataType="bigint" Style="0" Implicit="true"> 
                <ScalarOperator> 
                <Arithmetic Operation="MULT"> 
                 <ScalarOperator> 
                 <Identifier> 
                  <ColumnReference Column="@Page" /> 
                 </Identifier> 
                 </ScalarOperator> 
                 <ScalarOperator> 
                 <Const ConstValue="(200)" /> 
                 </ScalarOperator> 
                </Arithmetic> 
                </ScalarOperator> 
               </Convert> 
               </ScalarOperator> 
              </ColumnReference> 
              </Identifier> 
             </ScalarOperator> 
             <ScalarOperator> 
              <Const ConstValue="(0)" /> 
             </ScalarOperator> 
             </Compare> 
            </ScalarOperator> 
            </Logical> 
           </ScalarOperator> 
           </Condition> 
           <Then> 
           <ScalarOperator> 
            <Const ConstValue="(0)" /> 
           </ScalarOperator> 
           </Then> 
           <Else> 
           <ScalarOperator> 
            <Identifier> 
            <ColumnReference Column="ConstExpr1007"> 
             <ScalarOperator> 
             <Convert DataType="bigint" Style="0" Implicit="true"> 
              <ScalarOperator> 
              <Arithmetic Operation="MULT"> 
               <ScalarOperator> 
               <Identifier> 
                <ColumnReference Column="@Page" /> 
               </Identifier> 
               </ScalarOperator> 
               <ScalarOperator> 
               <Const ConstValue="(200)" /> 
               </ScalarOperator> 
              </Arithmetic> 
              </ScalarOperator> 
             </Convert> 
             </ScalarOperator> 
            </ColumnReference> 
            </Identifier> 
           </ScalarOperator> 
           </Else> 
          </IF> 
          </ScalarOperator> 
         </TopExpression> 
         <RelOp AvgRowSize="4055" EstimateCPU="0.00284444" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="100" LogicalOp="Compute Scalar" NodeId="3" Parallel="false" PhysicalOp="Sequence Project" EstimatedTotalSubtreeCost="0.0322701"> 
          <OutputList> 
          <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
          <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
          <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
          <ColumnReference Column="Expr1002" /> 
          </OutputList> 
          <RunTimeInformation> 
          <RunTimeCountersPerThread Thread="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
          </RunTimeInformation> 
          <SequenceProject> 
          <DefinedValues> 
           <DefinedValue> 
           <ColumnReference Column="Expr1002" /> 
           <ScalarOperator ScalarString="row_number"> 
            <Sequence FunctionName="row_number" /> 
           </ScalarOperator> 
           </DefinedValue> 
          </DefinedValues> 
          <RelOp AvgRowSize="4055" EstimateCPU="0.00071111" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="100" LogicalOp="Segment" NodeId="4" Parallel="false" PhysicalOp="Segment" EstimatedTotalSubtreeCost="0.0322621"> 
           <OutputList> 
           <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
           <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
           <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
           <ColumnReference Column="Segment1008" /> 
           </OutputList> 
           <RunTimeInformation> 
           <RunTimeCountersPerThread Thread="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
           </RunTimeInformation> 
           <Segment> 
           <GroupBy /> 
           <SegmentColumn> 
            <ColumnReference Column="Segment1008" /> 
           </SegmentColumn> 
           <RelOp AvgRowSize="4047" EstimateCPU="0.347654" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="100" LogicalOp="Filter" NodeId="5" Parallel="false" PhysicalOp="Filter" EstimatedTotalSubtreeCost="0.0322601"> 
            <OutputList> 
            <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
            <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
            <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
            </OutputList> 
            <RunTimeInformation> 
            <RunTimeCountersPerThread Thread="0" ActualRows="147" ActualEndOfScans="1" ActualExecutions="1" /> 
            </RunTimeInformation> 
            <Filter StartupExpression="false"> 
            <RelOp AvgRowSize="4047" EstimateCPU="0.434724" EstimateIO="9.53275" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1111.11" LogicalOp="Clustered Index Scan" NodeId="6" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.0312823" TableCardinality="395061"> 
             <OutputList> 
             <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
             <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
             <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
             </OutputList> 
             <RunTimeInformation> 
             <RunTimeCountersPerThread Thread="0" ActualRows="395061" ActualEndOfScans="1" ActualExecutions="1" /> 
             </RunTimeInformation> 
             <IndexScan Ordered="true" ScanDirection="BACKWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore"> 
             <DefinedValues> 
              <DefinedValue> 
              <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="id" /> 
              </DefinedValue> 
              <DefinedValue> 
              <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
              </DefinedValue> 
              <DefinedValue> 
              <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="date" /> 
              </DefinedValue> 
             </DefinedValues> 
             <Object Database="[timeflex]" Schema="[dbo]" Table="[debug]" Index="[PK_debug]" IndexKind="Clustered" Storage="RowStore" /> 
             </IndexScan> 
            </RelOp> 
            <Predicate> 
             <ScalarOperator ScalarString="[timeflex].[dbo].[debug].[message] like [@Filter]"> 
             <Intrinsic FunctionName="like"> 
              <ScalarOperator> 
              <Identifier> 
               <ColumnReference Database="[timeflex]" Schema="[dbo]" Table="[debug]" Column="message" /> 
              </Identifier> 
              </ScalarOperator> 
              <ScalarOperator> 
              <Identifier> 
               <ColumnReference Column="@Filter" /> 
              </Identifier> 
              </ScalarOperator> 
             </Intrinsic> 
             </ScalarOperator> 
            </Predicate> 
            </Filter> 
           </RelOp> 
           </Segment> 
          </RelOp> 
          </SequenceProject> 
         </RelOp> 
         </Top> 
        </RelOp> 
        <Predicate> 
         <ScalarOperator ScalarString="[Expr1002]&gt;CONVERT_IMPLICIT(bigint,[@Page]*(200)-(200),0) AND [Expr1002]&lt;=CONVERT_IMPLICIT(bigint,[@Page]*(200),0)"> 
         <Logical Operation="AND"> 
          <ScalarOperator> 
          <Compare CompareOp="GT"> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Column="Expr1002" /> 
           </Identifier> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Column="ConstExpr1006"> 
            <ScalarOperator> 
             <Convert DataType="bigint" Style="0" Implicit="true"> 
             <ScalarOperator> 
              <Arithmetic Operation="SUB"> 
              <ScalarOperator> 
               <Arithmetic Operation="MULT"> 
               <ScalarOperator> 
                <Identifier> 
                <ColumnReference Column="@Page" /> 
                </Identifier> 
               </ScalarOperator> 
               <ScalarOperator> 
                <Const ConstValue="(200)" /> 
               </ScalarOperator> 
               </Arithmetic> 
              </ScalarOperator> 
              <ScalarOperator> 
               <Const ConstValue="(200)" /> 
              </ScalarOperator> 
              </Arithmetic> 
             </ScalarOperator> 
             </Convert> 
            </ScalarOperator> 
            </ColumnReference> 
           </Identifier> 
           </ScalarOperator> 
          </Compare> 
          </ScalarOperator> 
          <ScalarOperator> 
          <Compare CompareOp="LE"> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Column="Expr1002" /> 
           </Identifier> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Column="ConstExpr1007"> 
            <ScalarOperator> 
             <Convert DataType="bigint" Style="0" Implicit="true"> 
             <ScalarOperator> 
              <Arithmetic Operation="MULT"> 
              <ScalarOperator> 
               <Identifier> 
               <ColumnReference Column="@Page" /> 
               </Identifier> 
              </ScalarOperator> 
              <ScalarOperator> 
               <Const ConstValue="(200)" /> 
              </ScalarOperator> 
              </Arithmetic> 
             </ScalarOperator> 
             </Convert> 
            </ScalarOperator> 
            </ColumnReference> 
           </Identifier> 
           </ScalarOperator> 
          </Compare> 
          </ScalarOperator> 
         </Logical> 
         </ScalarOperator> 
        </Predicate> 
        </Filter> 
       </RelOp> 
       </Sort> 
      </RelOp> 
      <ParameterList> 
       <ColumnReference Column="@Page" ParameterRuntimeValue="(1)" /> 
       <ColumnReference Column="@Filter" ParameterRuntimeValue="'%ZUser888%'" /> 
      </ParameterList> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
+5

問題は「好き」ではなく、 'row_number()'であることをどのように知っていますか?また、より新しいバージョンのSQL Serverでは、ページ設定に 'OFFSET' /' FETCH'を使用することができます。 –

+0

これは220Kのすべてのエントリをスキャンしようとしています。 ROW_NUMBERはボトルネックではありませんが、私の意見では30秒以上は時間がかかります。 –

+0

@GordonLinoff私の場合は、 'Microsoft SQL Server 2014(RTM-CU14)(KB3158271) - 12.0.2569.0(X64)5月27日2016 15:06:08 Copyright(c)Microsoft Corporation Standard Edition(64-bit)on Windows NT 6.3 (ビルド9600:)(ハイパーバイザ) 'が、少なくとも2010年、2012年、2014年および2016年に動作する必要があります。また、"フィルタリングと行番号付け "を書いています。 – Alexander

答えて

5

これはコメントが長すぎます。

最初にtextを使用しないでください。varchar(max)またはnvarchar(max)を使用してください。正式にはSQL Server 2016では廃止予定ですので、将来のバージョンでは表示されなくなる可能性があります。

ページネーションには、OFFSET/FETCHを使用してください。これはSQL Server 2012で導入されたため、やや互換性があります。 SQL Server 2010はありません。hereについて読むことができます。

テーブル/ページ/行の競合をパフォーマンスの問題の原因として排除してください。私の最高の推測は非常に広い列のlikeです。 messageが実際にフリーフォームのテキストの束である場合は、フルテキストインデックスを使用してください。始める場所は文書です。なんらかの理由で、私のMicrosoftのドキュメントへのリンクは今はうまくいっていませんが、見つけやすいはずです。

実際に行の幅が非常に広い場合は、select *に問題がある可能性があります。ページングを実行している場合、これはユーザーインターフェイスの可能性が高いので、実際に必要なものに制限することができます。また、列全体を表示するつもりがない場合は、実際に長いものを短くすることもできます。

+0

OK、私は2010年が間違っています。 – Alexander

関連する問題