0

選択クエリでパフォーマンスの問題があります。クエリには 4 分以上かかる場合があり、これは長すぎます。このクエリは .Net Client Process で起動されますが、Microsoft SQLServer Management Studio では起動されません。5秒の時もあれば、4分、1分、30秒の時もある。だから私は3つの質問があります:

  1. この選択クエリが長すぎるのはなぜですか? sqlserver のキャッシュを解放すると 5 秒もかからないからです。DBCC FREEPROCCACHE および DBCC DROPCLEANBUFFERS の命令でこのクエリをテストします

  2. インデックスを再構築するために sort_init という名前の sqlserver システム SQLTransaction が約 30 秒かかるのはなぜですか? この時間を短縮するにはどうすればよいですか?

  3. 実行計画で、クラスター化インデックス スキャンではなく、クラスター化インデックス シークを使用するのはなぜですか (すべてのページのスキャンに時間がかかる可能性があります)。スキャンされた各クラスター化インデックスは、各テーブルの主キーです。注意: join 句に Clustered Index Seek を持つこれらのテーブルを使用するクエリが他にもたくさんあります。私が間違っていることは何ですか?クエリをより高速に実行するにはどうすればよいですか? インデックスを最適化するにはどうすればよいですか?

私は SQL プロファイラーを使用して問題を追跡しているので、これらの主要なイベントがあります。

A) SQL プロファイラー:

  • SP:StmtCompleted:

テキストデータ:

`SELECT [DespatchNote].[Id], [DespatchNote].[RealType], [DespatchNote].[DbOwner], [DespatchNote].[Archived], [CreatedOn], [CreatedById], [UpdatedOn], [UpdatedById], [KeyingFinished], [IsValidated], [ValidatedOn], [ValidatedById], [Notes], [DefaultDisplayLanguageId], [ReferencedTransactionId], [TransactionNumber], [IsCanceled], [CanceledOn], [CanceledById], [TransactionType], [IsPending], [IsGenerated], [PrintCount], [LastPrintDate], [AttachedFile], [IsPointOfSalesTransaction], [IsAffiliatedTransaction], [IsDone], [DoneById], [DoneOn], [IsSent], [SentOn] FROM [DespatchNote] INNER JOIN [Flow] ON [DespatchNote].[Id] = [Flow].[Id] INNER JOIN [Transaction] ON [DespatchNote].[Id] = [Transaction].[Id] INNER JOIN [ProductsMovements] ON [DespatchNote].[Id] = [ProductsMovements].[Id] WHERE (([DespatchNote].[RealType] = @param42485) AND (([ProductsMovements].[IsDone] = @param42486) AND ([DespatchNote].[Archived] IS NULL)))`
  • 期間 (ミリ秒)

    : 201277

  • SQLTransaction :

ObjectName: sort_init
期間 (ミリ秒): 29982
EventSubClass: 1-Commit

B) SHOWPLAN_ALL をオンにしたクエリ

SELECT [DespatchNote].[Id], [DespatchNote].[RealType], [DespatchNote].[DbOwner], [DespatchNote].[Archived],   [CreatedOn], [CreatedById], [UpdatedOn], [UpdatedById], [KeyingFinished], [IsValidated], [ValidatedOn],    [ValidatedById], [Notes], [DefaultDisplayLanguageId], [ReferencedTransactionId], [TransactionNumber],    [IsCanceled], [CanceledOn], [CanceledById], [TransactionType], [IsPending], [IsGenerated],    [PrintCount], [LastPrintDate], [AttachedFile], [IsPointOfSalesTransaction], [IsAffiliatedTransaction],    [IsDone], [DoneById], [DoneOn], [IsSent], [SentOn]    FROM [DespatchNote]     INNER JOIN [Flow] ON [DespatchNote].[Id] = [Flow].[Id]     INNER JOIN [Transaction] ON [DespatchNote].[Id] = [Transaction].[Id]     INNER JOIN [ProductsMovements] ON [DespatchNote].[Id] = [ProductsMovements].[Id]     WHERE (([DespatchNote].[RealType] = (select top 1 DespatchNote.RealType from DespatchNote))     AND (([ProductsMovements].[IsDone] = 1)      AND ([DespatchNote].[Archived] IS NULL)))
  |--Merge Join(Inner Join, MERGE:([x3distributor].[dbo].[Flow].[Id])=([x3distributor].[dbo].[ProductsMovements].[Id]), RESIDUAL:([x3distributor].[dbo].[Flow].[Id]=[x3distributor].[dbo].[ProductsMovements].[Id]))
       |--Clustered Index Scan(OBJECT:([x3distributor].[dbo].[Flow].[PK_Flow]), ORDERED FORWARD)
       |--Merge Join(Inner Join, MERGE:([x3distributor].[dbo].[ProductsMovements].[Id])=([x3distributor].[dbo].[Transaction].[Id]), RESIDUAL:([x3distributor].[dbo].[Transaction].[Id]=[x3distributor].[dbo].[ProductsMovements].[Id]))
            |--Nested Loops(Inner Join, WHERE:([x3distributor].[dbo].[DespatchNote].[RealType]=[x3distributor].[dbo].[DespatchNote].[RealType]))
            |    |--Top(TOP EXPRESSION:((1)))
            |    |    |--Index Scan(OBJECT:([x3distributor].[dbo].[DespatchNote].[IX3_DespatchNote_RealType]))
            |    |--Merge Join(Inner Join, MERGE:([x3distributor].[dbo].[DespatchNote].[Id])=([x3distributor].[dbo].[ProductsMovements].[Id]), RESIDUAL:([x3distributor].[dbo].[DespatchNote].[Id]=[x3distributor].[dbo].[ProductsMovements].[Id]))
            |         |--Clustered Index Scan(OBJECT:([x3distributor].[dbo].[DespatchNote].[PK_DespatchNote]),  WHERE:([x3distributor].[dbo].[DespatchNote].[Archived] IS NULL) ORDERED FORWARD)
            |         |--Clustered Index Scan(OBJECT:([x3distributor].[dbo].[ProductsMovements].[PK_ProductsMovements]),  WHERE:([x3distributor].[dbo].[ProductsMovements].[IsDone]=(1)) ORDERED FORWARD)
            |--Clustered Index Scan(OBJECT:([x3distributor].[dbo].[Transaction].[PK_Transaction]), ORDERED FORWARD)

C) テーブルごとに DBCC SHOWCONTIG([MyTable]) を起動します。

DBCC SHOWCONTIG 分析 la テーブル 'Transaction'...

表 : 「取引」 (770101784) ; index ID : 1, base de données ID : 5 Analyze du niveau TABLE effectuée. - ページ分析................................................: 3690 - 拡張分析................................. ...................: 466 - Commutateurs d'extension................................. .......: 526 - Moyenne des pages par extension.................................: 7.9 - Densité d'analyse [meilleure valeur: valeur réelle].......: 87.67% [462:527] - Fragmentation d'analyse logique....: 1.95% - Fragmentation d'analyse d'extension.................: 5.79% - Moyenne d'octets libres per page................. ....: 631.1 - Densité de page moyenne (完全).................................: 92.20%

DBCC SHOWCONTIG 分析 la テーブル 'DespatchNote'...

表 : 'DespatchNote' (1138103095) ; index ID : 1, base de données ID : 5 Analyze du niveau TABLE effectuée. - ページ分析................................................................: 409 - 拡張機能分析................................. ...................: 52 - Commutateurs d'extension................................. .......: 51 - Moyenne des pages par extension.................................: 7.9 - Densité d'analyse [meilleure valeur: valeur réelle].......: 100.00% [52:52] - Fragmentation d'analyse logique....: 0.00% - Fragmentation d'analyse d'extension.................: 5.77% - Moyenne d'octets libres per page................. ....: 806.2 - Densité de page moyenne (完全).................................: 90.04%

DBCC SHOWCONTIG は、テーブル 'ProductsMovements' を分析します...

表 : 'ProductsMovements' (1074102867) ; index ID : 1, base de données ID : 5 Analyze du niveau TABLE effectuée. - ページ分析................................................................: 1112 - 拡張機能分析................................. ...................: 139 - Commutateurs d'extension................................. .......: 138 - Moyenne des pages par extension.................................: 8.0 - Densité d'analyse [meilleure valeur: valeur réelle].......: 100.00% [139:139] - Fragmentation d'analyse logique....: 0.00% - Fragmentation d'analyse d'extension.................: 5.76% - Moyenne d'octets libres per page................. ....: 725.6 - Densité de page moyenne (完全).................................: 91.03%

DBCC SHOWCONTIG 分析 la テーブル 'Flow'...

表 : 「フロー」 (1890105774) ; index ID : 1, base de données ID : 5 Analyze du niveau TABLE effectuée. - ページ分析................................................: 2662 - 拡張機能分析................................. ...................: 337 - Commutateurs d'extension................................. .........: 343 - Moyenne des pages par extension.................................: 7.9 - Densité d'analyse [meilleure valeur: valeur réelle].......: 96.80% [333:344] - Fragmentation d'analyse logique....: 0.45% - Fragmentation d'analyse d'extension.................: 5.93% - Moyenne d'octets libres per page................. ....: 579.2 - Densité de page moyenne (完全).................................: 92.84%

D) 各テーブルの詳細:

データベース内のすべてのテーブルについて、各インデックス (クラスター化されたものとクラスター化されていないもの) の断片化の合計は 10% 未満です。

送付状: (この表に 36360 行) (7 列)

インデックス: PK_DespatchNote(Cluster) IX3_DespatchNote_RealType(非固有、非クラスター) FK_DespatchNote_Archived(非固有、非クラスター)  テーブルを作成するスクリプト:

CREATE TABLE [dbo].[DespatchNote](
    [Id] [uniqueidentifier] NOT NULL,
    [Archived] [datetime] NULL,
    [RealType] [uniqueidentifier] NOT NULL,
    [DbOwner] [uniqueidentifier] NOT NULL,
    [RecordVersion] [timestamp] NOT NULL,
    [IsSent] [bit] NULL,
    [SentOn] [datetime] NULL,
 CONSTRAINT [PK_DespatchNote] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

トランザクション: (このテーブルの 136120 行) (20 列)

インデックス: PK_Transaction(クラスター) IX3_Transaction_RealType(非固有、非クラスター) FK_Transaction_ReferencedTransactionId(非固有、非クラスター) FK_Transaction_DefaultDisplayLanguageId(非固有、非クラスター) FK_Transaction_CanceledById(非固有、非クラスター) FK_Transaction_Archived(非固有、非クラスター)  スクリプトテーブルを作成します。

CREATE TABLE [dbo].[Transaction](
    [Id] [uniqueidentifier] NOT NULL,
    [Archived] [datetime] NULL,
    [RealType] [uniqueidentifier] NOT NULL,
    [DbOwner] [uniqueidentifier] NOT NULL,
    [RecordVersion] [timestamp] NOT NULL,
    [Notes] [ntext] NULL,
    [DefaultDisplayLanguageId] [uniqueidentifier] NULL,
    [ReferencedTransactionId] [uniqueidentifier] NULL,
    [TransactionNumber] [nvarchar](40) NULL,
    [IsCanceled] [bit] NULL,
    [CanceledOn] [datetime] NULL,
    [CanceledById] [uniqueidentifier] NULL,
    [TransactionType] [int] NOT NULL,
    [IsPending] [bit] NOT NULL,
    [IsGenerated] [bit] NOT NULL,
    [PrintCount] [int] NOT NULL,
    [LastPrintDate] [datetime] NULL,
    [AttachedFile] [image] NULL,
    [IsPointOfSalesTransaction] [bit] NOT NULL,
    [IsAffiliatedTransaction] [bit] NOT NULL,
 CONSTRAINT [PK_Transaction] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[Transaction] ADD  CONSTRAINT [DF_Transaction_TransactionType]  DEFAULT (0) FOR [TransactionType]
GO

ALTER TABLE [dbo].[Transaction] ADD  CONSTRAINT [DF_Transaction_IsPending]  DEFAULT (0) FOR [IsPending]
GO

ALTER TABLE [dbo].[Transaction] ADD  DEFAULT ((0)) FOR [IsGenerated]
GO

ALTER TABLE [dbo].[Transaction] ADD  CONSTRAINT [DF_Transaction_PrintCount]  DEFAULT ((0)) FOR [PrintCount]
GO

ALTER TABLE [dbo].[Transaction] ADD  CONSTRAINT [DF_Transaction_IsPointOfSalesTransaction]  DEFAULT ((0)) FOR [IsPointOfSalesTransaction]
GO

ALTER TABLE [dbo].[Transaction] ADD  CONSTRAINT [DF_Transaction_IsAffiliatedTransaction]  DEFAULT ((0)) FOR [IsAffiliatedTransaction]

フロー: (このテーブルの 136120 行) (13 列)

インデックス: PK_Flow(クラスタ)
IX3_Flow_RealType (非一意、非クラスタ) FK_Flow_ValidatedById(非一意、非クラスタ) FK_Flow_UpdatedById(非一意、非クラスタ) FK_Flow_CreatedById(非一意、非クラスタ) FK_Flow_Archived(非一意、非クラスタ)  スクリプトテーブルを作成します。

CREATE TABLE [dbo].[Flow](
    [Id] [uniqueidentifier] NOT NULL,
    [Archived] [datetime] NULL,
    [RealType] [uniqueidentifier] NOT NULL,
    [DbOwner] [uniqueidentifier] NOT NULL,
    [RecordVersion] [timestamp] NOT NULL,
    [CreatedOn] [datetime] NULL,
    [CreatedById] [uniqueidentifier] NULL,
    [UpdatedOn] [datetime] NULL,
    [UpdatedById] [uniqueidentifier] NULL,
    [KeyingFinished] [bit] NULL,
    [IsValidated] [bit] NULL,
    [ValidatedOn] [datetime] NULL,
    [ValidatedById] [uniqueidentifier] NULL,
 CONSTRAINT [PK_Flow] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

PRODUCTSMOVEMENTS : (このテーブルの 83631 行) (8 列)

インデックス: PK_ProductsMovements(クラスター) IX3_ProductsMovements_RealType(非固有、非クラスター) FK_ProductsMovements_DoneById(非固有、非クラスター) FK_ProductsMovements_Archived(非固有、非クラスター)  テーブルを作成するスクリプト:

CREATE TABLE [dbo].[ProductsMovements](
    [Id] [uniqueidentifier] NOT NULL,
    [Archived] [datetime] NULL,
    [RealType] [uniqueidentifier] NOT NULL,
    [DbOwner] [uniqueidentifier] NOT NULL,
    [RecordVersion] [timestamp] NOT NULL,
    [IsDone] [bit] NULL,
    [DoneById] [uniqueidentifier] NULL,
    [DoneOn] [datetime] NULL,
 CONSTRAINT [PK_ProductsMovements] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

さらに詳しい情報が必要な場合は、私にアドバイスしてくださいよろしくお願いします。

4

1 に答える 1

0

あなたのクエリは基本的に次のとおりです。

SELECT . . .
FROM [DespatchNote] INNER JOIN
     [Flow]
     ON [DespatchNote].[Id] = [Flow].[Id] INNER JOIN
     [Transaction]
     ON [DespatchNote].[Id] = [Transaction].[Id] INNER JOIN
     [ProductsMovements]
     ON [DespatchNote].[Id] = [ProductsMovements].[Id]
WHERE [DespatchNote].[RealType] = @param42485 AND
      [ProductsMovements].[IsDone] = @param42486 AND
      [DespatchNote].[Archived] IS NULL

まず、すべてのテーブルがid主キーとして宣言されています。悲しいかな、最もぶら下がっている果物が食べられます。i 次に、質問は追加のインデックスについてです。私の推測では、インデックスがDespatchNote(RealType, Archived, id)クエリに役立つと思います。これにより、結合に入るデータの量が減り、データベース エンジンが結合にインデックスを使用するようになる可能性があります。

于 2015-03-17T15:32:46.417 に答える