2016-07-21 8 views
1

次のクエリを実行するとサーバーを再起動すると、非常に時間がかかります。テーブルは1.500.000の行を持ち、クエリは140.000の行を返します。大きなテーブルで最初に実行されるクエリは、サーバーの再起動後に非常に長くかかります

select 
Oid, -- Primary Key 
IsTranslated -- bool(bit) column 
from Translation 
where [Language] = '24648b4e-05ac-42cb-b6cf-c1167b6a41b7' 

[言語]列にインデックスがあります。サーバーの再起動後の最初の実行には6分かかり、その後のクエリは完了するまでに1〜2秒かかります。クエリのFROM部分に「WITH(INDEX(iLanguage_Translation))」を追加しても、パフォーマンスは向上しませんでした。

しかしfollownigクエリは、サーバの再起動後の最初の実行で完了するために、わずか2秒かかる:

select Oid -- Primary Key 
from Translation 
where [Language] = '24648b4e-05ac-42cb-b6cf-c1167b6a41b7' 

2つのクエリ間の唯一の違いは、余分なブール値(ビット)列です。余分なビット列の140.000行の転送に6分かかるのはなぜですか?

SQL Server 2014には、i7 2700Kプロセッサと16GBのメモリが搭載されています。

CREATE TABLE [dbo].[Translation](
    [Oid] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    [PropertyName] [nvarchar](max) NULL, 
    [DefaultLanguageValue] [nvarchar](max) NULL, 
    [TranslatedValue] [nvarchar](max) NULL, 
    [IsTranslated] [bit] NULL, 
    [NodePath] [nvarchar](max) NULL, 
    [Description] [nvarchar](max) NULL, 
    [Language] [uniqueidentifier] NULL, 
    [OptimisticLockField] [int] NULL, 
    [GCRecord] [int] NULL, 
CONSTRAINT [PK_Translation] PRIMARY KEY CLUSTERED 
(
    [Oid] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

/****** Object: Index [iGCRecord_Translation] Script Date: 2016.07.21. 12:09:08 ******/ 
CREATE NONCLUSTERED INDEX [iGCRecord_Translation] ON [dbo].[Translation] 
(
    [GCRecord] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

/****** Object: Index [iLanguage_Translation] Script Date: 2016.07.21. 12:09:08 ******/ 
CREATE NONCLUSTERED INDEX [iLanguage_Translation] ON [dbo].[Translation] 
(
    [Language] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[Translation] WITH NOCHECK ADD CONSTRAINT [FK_Translation_Language] FOREIGN KEY([Language]) 
REFERENCES [dbo].[Language] ([Oid]) 
NOT FOR REPLICATION 
GO 

ALTER TABLE [dbo].[Translation] CHECK CONSTRAINT [FK_Translation_Language] 
GO 

私のWebアプリは、テーブルのすべての列を使用して使用される、最終的なクエリ:

SELECT [Oid] 
     ,[PropertyName] 
     ,[DefaultLanguageValue] 
     ,[TranslatedValue] 
     ,[IsTranslated] 
     ,[NodePath] 
     ,[Description] 
     ,[Language] 
     ,[OptimisticLockField] 
     ,[GCRecord] 
    FROM [dbo].[Translation] 
    where [Language] = '24648b4e-05ac-42cb-b6cf-c1167b6a41b7' 

実行計画:

ここ

表は、スクリプトを作成することです

Execution plan

実行計画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.4459.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="1" StatementEstRows="171288" StatementId="1" StatementOptmLevel="FULL" CardinalityEstimationModelVersion="120" StatementSubTreeCost="102.045" StatementText="SELECT [Oid],[PropertyName],[DefaultLanguageValue],[TranslatedValue],[IsTranslated],[NodePath],[Description],[Language],[OptimisticLockField],[GCRecord] FROM [dbo].[Translation] WHERE [Language][email protected]" StatementType="SELECT" QueryHash="0x7722D3C37A4ACDF4" QueryPlanHash="0xEBAED5C218B1FD8D" RetrievedFromCache="false"> 
      <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="1" CachedPlanSize="24" CompileTime="475" CompileCPU="2" CompileMemory="184"> 
      <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" /> 
      <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="209425" EstimatedPagesCached="104712" EstimatedAvailableDegreeOfParallelism="4" /> 
      <RelOp AvgRowSize="20181" EstimateCPU="2.07874" EstimateIO="99.9661" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="171288" LogicalOp="Clustered Index Scan" NodeId="0" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="102.045" TableCardinality="1889620"> 
       <OutputList> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Oid" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="PropertyName" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="DefaultLanguageValue" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="TranslatedValue" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="IsTranslated" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="NodePath" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Description" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Language" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="OptimisticLockField" /> 
       <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="GCRecord" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="144003" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false" Storage="RowStore"> 
       <DefinedValues> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Oid" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="PropertyName" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="DefaultLanguageValue" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="TranslatedValue" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="IsTranslated" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="NodePath" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Description" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Language" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="OptimisticLockField" /> 
        </DefinedValue> 
        <DefinedValue> 
        <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="GCRecord" /> 
        </DefinedValue> 
       </DefinedValues> 
       <Object Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Index="[PK_Translation]" IndexKind="Clustered" Storage="RowStore" /> 
       <Predicate> 
        <ScalarOperator ScalarString="[vintocon.archifm.Loc].[dbo].[Translation].[Language]={guid'24648B4E-05AC-42CB-B6CF-C1167B6A41B7'}"> 
        <Compare CompareOp="EQ"> 
         <ScalarOperator> 
         <Identifier> 
          <ColumnReference Database="[vintocon.archifm.Loc]" Schema="[dbo]" Table="[Translation]" Column="Language" /> 
         </Identifier> 
         </ScalarOperator> 
         <ScalarOperator> 
         <Const ConstValue="{guid'24648B4E-05AC-42CB-B6CF-C1167B6A41B7'}" /> 
         </ScalarOperator> 
        </Compare> 
        </ScalarOperator> 
       </Predicate> 
       </IndexScan> 
      </RelOp> 
      <ParameterList> 
       <ColumnReference Column="@1" ParameterCompiledValue="'24648b4e-05ac-42cb-b6cf-c1167b6a41b7'" ParameterRuntimeValue="'24648b4e-05ac-42cb-b6cf-c1167b6a41b7'" /> 
      </ParameterList> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
+1

を私はそれがキャッシュについてですと仮定します。再起動する代わりに 'DBCC DROPCLEANBUFFERS'を試してください。同じ効果があるはずです。 –

+0

私はあまりにも、ページが初めて使用されたときにバッファープールがいっぱいになると思います。クラスタリングされたキーがGUIDであるクラスタ化インデックスに1.5mの行が保存されているとすれば、インデックスが非常に断片化していると推測します。なぜなら、すべてのページをメモリに読み込むのに時間がかかる理由を説明します。 – GarethD

答えて

2

実行計画して約KeyLookup操作を読み、屋根付きのインデックス作成:

CREATE NONCLUSTERED INDEX [iLanguage_Translation] 
    ON [dbo].[Translation] ([Language]) INCLUDE (IsTranslated) 
+0

問題は、私の最終的なクエリでは、selectのカラムをすべて必要とし、varchar(max)カラムをインデックスとして使用できないということです。 –

+0

ご質問では最終的なクエリは表示されません...質問と実際の実行計画を提供 – Devart

+0

質問を更新 –

関連する問題