0

大きなテーブルの巨大なデータベースがありますが、複数のテーブルからのデータ取得 (クエリは約 10 個の内部結合で構成されています) では、データベースからデータを取得するのに時間がかかりすぎます (場合によっては 10 ~ 20 秒または数分)。クエリには、ほとんどのテーブルのほぼすべての列と、残りのほぼ半分の列が必要です。

私の質問は、私の場合、SQL Server 2012 列ストア アーキテクチャを使用することがどれほど役立つかということです。現在、私はSQL Server 2008を使用しています。このタイプのクエリを最適化する必要があるため、時間の最適化に関する他の提案は大歓迎です

SELECT Seq.SeqId,Seq.ThreadId, Seq.Subject,LastAccessed, Seq.State, Seq.AlarmSent,Prop.RegionCode ,Seq.Rating , Seq.ClassId, Seq.SeqMedium, 
Seq.SeqPriority, Seq.StatusDate , Seq.SeqCreateDt, Seq.StartDate, Seq.LastModified, Seq.Resolved, Seq.SeqSrcId, Seq.StatusReason , SeqDocument.DocId, 
SeqDocument.IsCheckedOut, SeqDocument.CheckedOutById , SeqDocument.Remarks, Prop.PahLName ,OC.ClassID,OC.ClassName,OC.ClassShortName,OC.Description ,
OC.ParentID,OC2.ClassName AS ParentClassName,OC.OrgID ,CM.DeptID,CM.Severity,CM.Nature ,ST.TargetClsId,ST.TargetSubClsId,ST.TargetId, ST.ResponderActive, 
ST.TargetType, ST.SentDate ,SF.FlowId, SF.InwardNo, SF.OutwardNo,SF.InwardDate,SF.OutwardDate ,SF.FlowOrder,SF.OriginatorState,SF.ResponderState,SF.PrevFlowId ,
SF.SeqFlowSrcClsId,SF.SeqFlowSrcId, OrgP.Name, SF.FlowStatus  , 
CASE Prop.BCPNO  WHEN '' THEN Prop.TempNo  ELSE Prop.BCPNO END  AS FileNo, Prop.DeveloperName ,PROP.BCPNO,PROP.CaseType, Prop.OwnerFName,
PROP.InwardDate as ProposalInwardDate, PROP.CaseTrack ,PROP.TempNo, PROP.FastTrackNo ,Prop.RevNo ,PROP.CTSNo as CTSNo, PROP.FinalPlotNo as FinalPlotNo, 
SeqDocument.CurrentSequence,IsNull(PROP.ProposalID,0) as ProposalID,IsNull(PROP.PlotRegion,0) as PlotRegion,
IsNull(Prop.ReservationID,0) as ReservationID, Prop.ADRunKey,IsNull(Prop.ApplicantName, '') as ApplicantName, Prop.CaseSubType,
IsNull(Prop.OwnerPeth,'') as OwnerPeth,   Prop.ProposedProject, P.Name as ConsultantName, Prop.CURRENTSTAGEID, Seq.SequenceMode, Seq.Sequencebody, 
Seq.Phaseid, PROP.RegionCode, Seq.SequenceNo, Seq.Validity, Seq.BillDate, Seq.BillNo, Seq.TransactionRegion 

FROM Sequence Seq 
INNER JOIN Sequence$Document SeqDocument ON Seq.SeqId = SeqDocument.DocId 
LEFT OUTER JOIN ClassMapping CM ON Seq.ClassId = CM.ClassID 
LEFT OUTER JOIN ObjectClass OC ON CM.ClassID = OC.ClassID 
LEFT OUTER JOIN ObjectClass  OC2 ON OC.ParentID = OC2.ClassID 
LEFT OUTER JOIN Sequence_Flow SF ON Seq.SeqID = SF.SeqID 
LEFT OUTER JOIN OrgPeople OrgP ON Seq.SeqSrcId = OrgP.Id And Seq.SeqSrcClsId = OrgP.ClsId  
LEFT OUTER JOIN TemplateProposals PROP ON Seq.SeqID = PROP.DocId 
LEFT OUTER JOIN Sequence_Flow_Target ST ON SF.FlowId = ST.FlowId 
LEFT OUTER JOIN People P ON P.PeopleId = PROP.ArchitectId 

WHERE SeqClsId = 6 AND SeqSubClsId = 1  AND Seq.SeqTypId = 3 
AND Seq.SeqSubTypId = 0 AND Seq.State IN (1,2,3,5)  AND ST.ResponderActive IN ('1', '2') 
AND ST.TARGETPOSTID IN (132,1333,135,136 )  
Order By  ProposalInwardDate  DESC

このクエリは、Intel (i5 3.00GHz) 8GB RAM で約 50 秒かかり、結果は 5676 行になります。

Sequence 176232 行 38 列、Sequence$Document 132776 行 8 列、ClassMapping 6 行 10 列、ObjectClass 6 行 11 列、Sequence_Flow 4847730 行 22 列、OrgPeople 4656 行 11 列、TemplateProposals 90889 行 64 列、Sequence_Flow_Target 521621 行 9 列、人 4655 行 67 列。

すべての属性のデータ型は (数値、文字列、日付) にあります

4

1 に答える 1

1

あなたの場合の列ストア インデックスはあまり役に立ちません。SQL Server 2012 でバッチ実行モードをサポートしていない LEFT JOIN を使用しています。圧縮の改善が得られます (その品質は、文字列列の類似度と大きさによって異なります) )、しかし残念ながら、全体として大きな改善は見られません。

SQL Server 2014 とクラスター化された列ストアに移行すると、大いに役立つ場合があります。:)

于 2016-07-28T15:25:20.273 に答える