SQLServer Select Проблема производительности запроса

У меня проблема с производительностью запроса select. Запрос может занять более 4 минут, что слишком долго. Этот запрос запускается в.Net Client Process, но не в Microsoft SQLServer Management Studio. Таким образом, он может составлять иногда 5 секунд, а иногда - 4 минуты, 1 минуту, 30 секунд. Итак, у меня есть 3 вопроса:

  1. Почему этот запрос на выбор слишком длинный? Потому что это может сделать менее 5 секунд при свободном кеше sqlserver. Я проверяю этот запрос с инструкциями DBCC FREEPROCCACHE и DBCC DROPCLEANBUFFERS

  2. Почему SQLTransaction системы sqlserver с именем sort_init для перестроения индексов занимает около 30 секунд? Как я могу приступить к сокращению этого времени?

  3. Почему в плане выполнения у меня есть Clustered Index Scan, а не Clustered Index Seek (сканирование всей страницы может занять много времени) . Каждый сканированный кластерный индекс является первичным ключом каждой таблицы. NB: у меня есть еще много запросов с использованием этих таблиц, в которых есть Clustered Index Seek при соединении. Что я делаю не так? Как я мог заставить запрос работать быстрее? Как я могу оптимизировать индекс?

Я использую SQL Profiler для отслеживания проблемы, поэтому у меня есть следующие основные события:

А) SQL Profiler:

  • SP: StmtCompleted:

TextData:

`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 анализировать таблицу "Транзакция"...

Таблица "Транзакция" (770101784); Индекс ID: 1, базовый номер донна ID: 5 Analyze du niveau TABLE effectuée. - Pages analysées................................: 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] - Логика фрагментарного анализа.................: 1,95% - Анализ фрагментации Расширение...................: 5,79% - Moyenne d'octets libres par page.....................: 631,1 - Densité de page moyenne (полная версия).....................: 92,20%

DBCC SHOWCONTIG проанализировать таблицу 'DespatchNote'...

Таблица: "DespatchNote" (1138103095); Индекс ID: 1, базовый номер донна ID: 5 Analyze du niveau TABLE effectuée. - Pages analysées................................: 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] - Логика фрагментарного анализа..................: 0,00% - Анализ фрагментации Расширение...................: 5,77% - Moyenne d'octets libres par page.....................: 806.2 - Densité de page moyenne (полная версия).....................: 90,04%

DBCC SHOWCONTIG проанализировать таблицу "Продукты движения"...

Таблица: "Продукты" (1074102867); Индекс ID: 1, базовый номер донна ID: 5 Analyze du niveau TABLE effectuée. - Pages analysées................................: 1112 - Расширения анализируемые..............................: 139 - Commutateurs d'Extension..............................: 138 - Расширение Moyenne des pages par........................: 8.0 - Densité d'analyse [meilleure valeur:valeur réelle].......: 100,00% [139:139] - Логика фрагментарного анализа.................: 0,00% - Анализ фрагментации Расширение...................: 5,76% - Moyenne d'octets libres par page.....................: 725,6 - Densité de Page Moyenne (полная версия).....................: 91,03%

DBCC SHOWCONTIG анализировать таблицу "Поток"...

Таблица: "Поток" (1890105774); Индекс ID: 1, базовый номер донна ID: 5 Analyze du niveau TABLE effectuée. - Pages analysées................................: 2662 - Расширения Analysées..............................: 337 - Commutateurs d'Extension..............................: 343 - Moyenne des pages par extension........................: 7.9 - Densité d'analyse [meilleure valeur:valeur réelle].......: 96,80% [333:344] - Логика фрагментарного анализа.................: 0,45% - Анализ фрагментации Расширение...................: 5,93% - Moyenne d'octets libres par page.....................: 579.2 - Densité de page moyenne (полная версия).....................: 92,84%

D) Детали для каждой таблицы:

Для всей таблицы в моей базе данных каждый индекс (кластеризованный и некластеризованный) имеет общую фрагментацию менее 10 %.

ОТПРАВЛЕНИЕ: (36360 ЛИНИЙ НА ЭТОМ СТОЛЕ) (7 КОЛОНН)

Индексы: PK_DespatchNote(кластер) 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(Cluster) IX3_Transaction_RealType(не уникальное, не кластерное) FK_Transaction_ReferencedTransactionId(не уникальное, не кластерное) FK_Transaction_DefaultDisplayLanguageId(не уникальное, не кластерное не уникальное) создать таблицу:

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(не уникальный, не кластерный) .

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]

ИЗДЕЛИЯ ИЗДЕЛИЯ: (83631 ЛИНИЙ НА ЭТОМ СТОЛЕ) (8 КОЛОНН)

Индексы: PK_ProductsMovements(Cluster) IX3_ProductsMovements_RealType(не уникальный, не кластерный) FK_ProductsMovements_DoneById(не уникальный, не кластерный) FK_ProductsMovements_Archived(не уникальный, не кластерный) ript Сценарий для создания таблицы:

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]

Если вы хотите получить больше информации, пожалуйста, сообщите мне с уважением Спасибо.

1 ответ

Ваш запрос в основном:

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 объявлен в качестве первичного ключа. Увы, самый низкий висящий фрукт съеден. Далее следует вопрос о дополнительных индексах. Я думаю, что индекс на DespatchNote(RealType, Archived, id) поможет запрос. Это должно уменьшить объем данных, поступающих в объединения, и может побудить ядро ​​базы данных использовать индексы для объединений.

Другие вопросы по тегам