Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
sql001 Member Откуда: Сообщений: 10 |
Добрый день Имеется предельно простая таблица: CREATE TABLE [dbo].[WareIO]( [wioID] [int] IDENTITY(1,1) NOT NULL, [wioLink] [uniqueidentifier] NOT NULL, [wioDirectLink] [uniqueidentifier] NULL, [wioDate] [datetime] NOT NULL, [wioGood] [int] NOT NULL, [wioCount] [money] NOT NULL, [wioPrice] [money] NOT NULL, [wioSumm] AS ([wioCount]*[wioPrice]) PERSISTED, [wioAuthor] [varchar](15) NOT NULL, [wioDevision] [int] NOT NULL, [wioActive] [bit] NOT NULL, [wioLock] [bit] NOT NULL, CONSTRAINT [PK_WareIO] PRIMARY KEY CLUSTERED ( [wioID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] в ней всего лишь около 6,5 млн записей... внешних ключей нет... есть еще 3 некластеризованных индекса... Выполнение запроса: delete from WareIO where wioLink = '<some guid>'(или даже без условия) происходит за астрономическое время... План выполнения: ![]() Показывает что 82% уходит на обработку индексов. по связанным индексированным представлениям все проходит хорошо... Не пойму в каком направлении идти чтобы оптимизировать быстродействие при удалении...? Спасибо. |
8 авг 13, 11:44 [14680152] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
в направлении уменьшения числа индексов разумеется |
||
8 авг 13, 11:46 [14680171] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
Может у вас есть лишние индексы?? |
||
8 авг 13, 11:51 [14680202] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
А по wioLink индекс имеется? |
8 авг 13, 11:52 [14680211] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
"Астрономическое время" — это сколько в системе единиц СИ? "Даже без условия" — это как? delete from WareIO, все 6,5 млн записей? А если с условием, то сколько записей удаляется? |
||
8 авг 13, 11:56 [14680240] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
[SQL] CREATE TABLE #t1 (id int PRIMARY KEY CLUSTERED, n varchar(50)) CREATE TABLE #t2 (id int PRIMARY KEY CLUSTERED, n varchar(50)) CREATE INDEX #ix2 on #t2(n) insert #t1 SELECT 1,'a' union select 2,'b' insert #t2 SELECT 1,'a' union select 2,'b' set statistics IO on DELETE FROM #t1 WHERE n='b' DELETE FROM #t2 WHERE n='b' set statistics IO off DROP TABLE #t1 DROP TABLE #t2 [/SQL] Статистика IO весьма весомо объясняет, что от увеличения количества индексов количество логических чтений/записей увеличивается: Table '#t1' -- Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table '#t2' -- Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Думаю, в комментариях это уже не нуждается. Да и в Actual Plan вес первого DELETE меньше второго в 2 раза. |
8 авг 13, 12:01 [14680292] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
пля...CREATE TABLE #t1 (id int PRIMARY KEY CLUSTERED, n varchar(50)) CREATE TABLE #t2 (id int PRIMARY KEY CLUSTERED, n varchar(50)) CREATE INDEX #ix2 on #t2(n) insert #t1 SELECT 1,'a' union select 2,'b' insert #t2 SELECT 1,'a' union select 2,'b' set statistics IO on DELETE FROM #t1 WHERE n='b' DELETE FROM #t2 WHERE n='b' set statistics IO off DROP TABLE #t1 DROP TABLE #t2 |
8 авг 13, 12:02 [14680297] Ответить | Цитировать Сообщить модератору |
sql001 Member Откуда: Сообщений: 10 |
Астрономическое это 100 тыс. записей за 2-3 минуты... хм... снес индексы удаление пошло веселее... посмотрим как упадет производительность в, теперь, не индексированных данных... Спасибо большое. PS. А так хотелось увидеть "волшебную" директиву в DELETE или индексу которая решила бы вопрос... :) |
8 авг 13, 12:18 [14680409] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Как можно удалять информацию быстрее, если мест, где она расположена, много ? |
||
8 авг 13, 12:20 [14680422] Ответить | Цитировать Сообщить модератору |
sql001 Member Откуда: Сообщений: 10 |
Поэтому "волшебную" |
8 авг 13, 12:42 [14680573] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
drop index |
||
8 авг 13, 12:42 [14680583] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
sql001, Можно сделать ALTER INDEX ... DISABLE непосредственно перед удалением данных, а потом заребилдить. Они же вам потом, я так понимаю, еще потребуются... |
9 авг 13, 03:09 [14684545] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |