Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 лучший execution plan для запроса delete from table where  [new]
Aliced
Member

Откуда:
Сообщений: 301
Для одной и той же таблицы с одними и теми же данными для одного и того же запроса получаю несколько видов планов запроса с разным временем выполнения. Не могу понять, какой лучше и как добиться именно нужного (планы в приложенном рисунке):
1. index seek, key lookup и затем clustered index delete - непонятно когда же обновляются другие индексы.
2. index seek, затем clustered index delete, а затем sequence по остальным индексам и выполнение index delete с использованием table spool

CREATE TABLE для таблицы:
+
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[XXXATTRIBUTEVALUE](
	[ATTRIBUTEID] [nvarchar](25) NOT NULL DEFAULT (''),
	[ITEMID] [nvarchar](20) NOT NULL DEFAULT (''),
	[ATTRIBUTEVALUE] [nvarchar](800) NOT NULL DEFAULT (''),
	[INDEX1] [int] NOT NULL DEFAULT ((0)),
	[ECITEMREFRECID] [bigint] NOT NULL DEFAULT ((0)),
	[ATTRIBUTEREFRECID] [bigint] NOT NULL DEFAULT ((0)),
	[UNITID] [nvarchar](10) NOT NULL DEFAULT (''),
	[CONTENTMANAGERID] [nvarchar](50) NOT NULL DEFAULT (''),
	[DATAAREAID] [nvarchar](4) NOT NULL DEFAULT ('dat'),
	[RECVERSION] [int] NOT NULL DEFAULT ((1)),
	[RECID] [bigint] NOT NULL,
 CONSTRAINT [I_30871RECID] PRIMARY KEY CLUSTERED 
(
	[DATAAREAID] ASC,
	[RECID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[XXXATTRIBUTEVALUE]  WITH CHECK ADD CHECK  (([RECID]<>(0)))
GO


Индексы:
+
idxname				type_desc	uniq	columns_							index_length
I_30871ATTRIBUTEITEMIDX NONCLUSTERED 0 DATAAREAID, ATTRIBUTEID, ITEMID, 98
I_30871ATTRIBUTEITEMVALUEIDX NONCLUSTERED 0 DATAAREAID, ITEMID, UNITID, CONTENTMANAGERID, ATTRIBUTEID, 218
I_30871ECITEMREFRECIDIDX NONCLUSTERED 0 DATAAREAID, ECITEMREFRECID, 16
I_30871ITEMINDEX1IDX NONCLUSTERED 0 DATAAREAID, ITEMID, INDEX1, 52
I_30871RECID CLUSTERED 1 DATAAREAID, RECID, 16


Перед каждым тестом делаю зачистку
+
ALTER INDEX ALL ON xxxattributevalue REBUILD WITH (SORT_IN_TEMPDB = ON)
UPDATE STATISTICS xxxattributevalue
DBCC FREESYSTEMCACHE ('ALL')

checkpoint
dbcc DropCleanBuffers
5 мар 16, 01:49    [18899469]     Ответить | Цитировать Сообщить модератору
 Re: лучший execution plan для запроса delete from table where  [new]
Aliced
Member

Откуда:
Сообщений: 301
планы

К сообщению приложен файл. Размер - 131Kb
5 мар 16, 01:50    [18899470]     Ответить | Цитировать Сообщить модератору
 Re: лучший execution plan для запроса delete from table where  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Aliced,

В зависимости от числа удаляемых строк, план для удаления может быть либо:
- Per-Index Plan (Wide plan) - по-индексно
- Per-Row Plan (Narrow plan) - по-строчно

Форма плана зависит от стоимости (предполагаемого числа строк, числа индексов и т.д.). Эффективность плана зависит от того, насколько оценки близки к реальности. Кроме того, на забывайте, что при операциях модификации (как и везде, но тут особенно) производительность зависит не только от плана.

Более подробно нет времени объяснять, читайте по ссылкам:
Optimizing T-SQL queries that change data
SQL Server Performance Tuning : Per-Row and Per-Index Plans
5 мар 16, 03:15    [18899501]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить