選択クエリでパフォーマンスの問題があります。クエリには 4 分以上かかる場合があり、これは長すぎます。このクエリは .Net Client Process で起動されますが、Microsoft SQLServer Management Studio では起動されません。5秒の時もあれば、4分、1分、30秒の時もある。だから私は3つの質問があります:
この選択クエリが長すぎるのはなぜですか? sqlserver のキャッシュを解放すると 5 秒もかからないからです。DBCC FREEPROCCACHE および DBCC DROPCLEANBUFFERS の命令でこのクエリをテストします
インデックスを再構築するために sort_init という名前の sqlserver システム SQLTransaction が約 30 秒かかるのはなぜですか? この時間を短縮するにはどうすればよいですか?
- 実行計画で、クラスター化インデックス スキャンではなく、クラスター化インデックス シークを使用するのはなぜですか (すべてのページのスキャンに時間がかかる可能性があります)。スキャンされた各クラスター化インデックスは、各テーブルの主キーです。注意: 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]
さらに詳しい情報が必要な場合は、私にアドバイスしてくださいよろしくお願いします。