Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Добрый уважаемые коллеги,
в программе через Dotnet библиотеку
System.Data.SqlClient.SqlCommand.'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
запускается следующий запрос
+

UPDATE [$ndo$navlistener].[CompanyName$upgrade355_Dim]
   SET [DimSetID] = (select DimSetID   
                     from  [$ndo$navlistener].[CompanyName$upgrade355_DimSetID] as D 
					 where
					  (
						 ( D.DimVal1 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 ) or 
						 ( D.DimVal1 is null   ) and 
						 ( [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 is null )
					  ) 
					  and (
						 (D.DimVal2 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal2 ) or 
						 (D.DimVal2 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal2 is null)
					  ) 
					  and (
						 (D.DimVal3 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal3 ) or 
						 (D.DimVal3 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal3 is null)
					  ) 
					  and (
						 (D.DimVal4 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal4 ) or 
						 (D.DimVal4 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal4 is null)
					  ) 
					  and (
						 (D.DimVal5 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal5 ) or 
						 (D.DimVal5 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal5 is null)
					  ) 
					  and (
						 (D.DimVal6 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal6 ) or 
						 (D.DimVal6 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal6 is null)
					  ) 
					  and (
						 (D.DimVal7 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal7 ) or 
						 (D.DimVal7 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal7 is null)
					  ) 
					  and (
						 (D.DimVal8 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal8 ) or 
						 (D.DimVal8 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal8 is null)
					  ) 
					  and (
						 (D.DimVal9 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal9 ) or 
						 (D.DimVal9 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal9 is null)
					  ) 
					  and (
						 (D.DimVal10 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal10 ) or 
						 (D.DimVal10 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal10 is null)
					  ) 
					  and (
						 (D.DimVal11 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal11 ) or 
						 (D.DimVal11 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal11 is null)
					  ) 
					  and (
						 (D.DimVal12 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal12 ) or 
						 (D.DimVal12 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal12 is null)
					   )
					  and (
						 (D.DimVal13 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal13 ) or 
						 (D.DimVal13 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal13 is null)
					  )
					  and (
						 (D.DimVal14 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal14 ) or 
						 (D.DimVal14 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal14 is null)
					  ) 
					  and (
						 (D.DimVal15 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal15 ) or 
						 (D.DimVal15 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal15 is null)
					  ) 
					  and (
						 (D.DimVal16 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal16 ) or 
						 (D.DimVal16 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal16 is null)
					  ) 
					  and (
						 (D.DimVal17 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal17 ) or 
						 (D.DimVal17 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal17 is null)
					  ) 
					  and (
						 (D.DimVal18 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal18 ) or 
						 (D.DimVal18 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal18 is null)
					  ) 
					  and (
						 (D.DimVal19 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal19 ) or 
						 (D.DimVal19 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal19 is null)
					  ) 
					  and (
						 (D.DimVal20 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal20 ) or 
						 (D.DimVal20 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal20 is null)
					  ) 
					  and (
						 (D.DimVal21 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal21 ) or 
						 (D.DimVal21 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal21 is null)
					  ) 
					  and (
						 (D.DimVal22 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal22 ) or 
						 (D.DimVal22 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal22 is null)
					  ) 
					  and (
						 (D.DimVal23 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal23 ) or 
						 (D.DimVal23 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal23 is null)
					  ) 
					  and (
						 (D.DimVal24 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal24 ) or 
						 (D.DimVal24 is null)and
						 ([$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal24 is null))
   )



Предварительный план выполнения в тхт во вложении

Статистика Клиента
Время выполнения клиента 19:55:34
Статистика по профилю запроса
Количество инструкций INSERT, DELETE и UPDATE 0
Строки, изменяемые инструкциями INSERT, DELETE и UPDATE 0
Количество инструкций SELECT 2
Строк, возвращенных инструкциями SELECT 10
Количество транзакций 0
Сетевая статистика
Количество циклов обращения к серверу 6
TDS-пакетов отправлено клиентом 8
TDS-пакетов получено с сервера 11
байтов отправлено клиентом 11908
байтов получено с сервера 23103
Статистика по времени
Время обработки клиента 16
Общее время выполнения 62
Время ожидания при ответе сервера 46

Из плана вижу что 99% стоимости идет на поиск по кластерному ключу. Что можно предпринять для ускорения запроса?

P.S. Запрос писал не сам, это процедура предоставлена Microsoft для обновления ERP с одной версии на другую.

К сообщению приложен файл (3 запрос.csv - 7Kb) cкачать
4 апр 15, 20:22    [17474121]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Таблица [$ndo$navlistener].[CompanyName$upgrade355_Dim] кол-во записей 9 973 094
+

/****** Object: Table [$ndo$navlistener].[CompanyName$upgrade355_Dim] Script Date: 04.04.2015 20:24:05 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [$ndo$navlistener].[CompanyName$upgrade355_Dim](
[Table ID] [int] NOT NULL,
[Entry No_] [int] NOT NULL,
[DimSetID] [int] NOT NULL,
[DimVal1] [nvarchar](20) NULL,
[DimVal2] [nvarchar](20) NULL,
[DimVal3] [nvarchar](20) NULL,
[DimVal4] [nvarchar](20) NULL,
[DimVal5] [nvarchar](20) NULL,
[DimVal6] [nvarchar](20) NULL,
[DimVal7] [nvarchar](20) NULL,
[DimVal8] [nvarchar](20) NULL,
[DimVal9] [nvarchar](20) NULL,
[DimVal10] [nvarchar](20) NULL,
[DimVal11] [nvarchar](20) NULL,
[DimVal12] [nvarchar](20) NULL,
[DimVal13] [nvarchar](20) NULL,
[DimVal14] [nvarchar](20) NULL,
[DimVal15] [nvarchar](20) NULL,
[DimVal16] [nvarchar](20) NULL,
[DimVal17] [nvarchar](20) NULL,
[DimVal18] [nvarchar](20) NULL,
[DimVal19] [nvarchar](20) NULL,
[DimVal20] [nvarchar](20) NULL,
[DimVal21] [nvarchar](20) NULL,
[DimVal22] [nvarchar](20) NULL,
[DimVal23] [nvarchar](20) NULL,
[DimVal24] [nvarchar](20) NULL
) ON [Data Filegroup 1]

Таблица [$ndo$navlistener].[CompanyName$upgrade355_DimSetID] кол-во записей 422 739
+

/****** Object: Table [$ndo$navlistener].[CompanyName$upgrade355_DimSetID] Script Date: 04.04.2015 20:26:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [$ndo$navlistener].[CompanyName$upgrade355_DimSetID](
[DimSetID] [int] NOT NULL,
[DimVal1] [nvarchar](20) NULL,
[DimVal2] [nvarchar](20) NULL,
[DimVal3] [nvarchar](20) NULL,
[DimVal4] [nvarchar](20) NULL,
[DimVal5] [nvarchar](20) NULL,
[DimVal6] [nvarchar](20) NULL,
[DimVal7] [nvarchar](20) NULL,
[DimVal8] [nvarchar](20) NULL,
[DimVal9] [nvarchar](20) NULL,
[DimVal10] [nvarchar](20) NULL,
[DimVal11] [nvarchar](20) NULL,
[DimVal12] [nvarchar](20) NULL,
[DimVal13] [nvarchar](20) NULL,
[DimVal14] [nvarchar](20) NULL,
[DimVal15] [nvarchar](20) NULL,
[DimVal16] [nvarchar](20) NULL,
[DimVal17] [nvarchar](20) NULL,
[DimVal18] [nvarchar](20) NULL,
[DimVal19] [nvarchar](20) NULL,
[DimVal20] [nvarchar](20) NULL,
[DimVal21] [nvarchar](20) NULL,
[DimVal22] [nvarchar](20) NULL,
[DimVal23] [nvarchar](20) NULL,
[DimVal24] [nvarchar](20) NULL,
[ID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [CompanyName$pk_dim355_id] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
) ON [Data Filegroup 1]

GO
4 апр 15, 20:32    [17474134]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
вот монитор активности. Так продолжается уже 3 часа.

К сообщению приложен файл. Размер - 87Kb
4 апр 15, 20:45    [17474155]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
тестран
Guest
Grigoriy123,

поищи есть ли у тебя нуллы по этим полям
можно попробовать разбить апдейт: 1) четкие сравнения без нуллов вообще 2) потом отдельно остальное
+может индексы фильтрованные построить
4 апр 15, 21:45    [17474264]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
тестран
Grigoriy123,

1) четкие сравнения без нуллов вообще

попробыл время стало 22 часа но план выполнения изменился смотрите вложения

тестран
+может индексы фильтрованные построить
я так понимаю фильтр <>NULL так?

полез в индексы обнаружил забавную вещь, как раньше не видел, в индексе только первые 4 поля DimVal в обоих таблицах
+

/****** Object: Index [CompanyName$ix_upgrade355_DimSetID] Script Date: 04.04.2015 22:12:43 ******/
CREATE NONCLUSTERED INDEX [CompanyName$ix_upgrade355_DimSetID] ON [$ndo$navlistener].[CompanyName$upgrade355_DimSetID]
(
[DimVal1] ASC,
[DimVal2] ASC,
[DimVal3] ASC,
[DimVal4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
GO


От сюда вопрос сколько полей туда добавить? все 24 штуки? а ресурсы на обновления индекса не превысит выигрыш в выполнении запроса?

К сообщению приложен файл (3 запрос без NULL.csv - 7Kb) cкачать
4 апр 15, 22:29    [17474374]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
полей дал добавить только 16. Но думаю это не выход.
Попробую в каком поле меньше всего NULL и его включу в ключ.
Либо пойти по пути селективности каждого столбца. Самый селективный в начало и по убыванию. Как кто думает?
4 апр 15, 22:46    [17474423]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
тестран
Guest
Grigoriy123,

строк-то в таблице сколько?
4 апр 15, 22:53    [17474442]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Вот тут писал про кол-во записей
Grigoriy123
Таблица [$ndo$navlistener].[CompanyName$upgrade355_Dim] кол-во записей 9 973 094

Grigoriy123
Таблица [$ndo$navlistener].[CompanyName$upgrade355_DimSetID] кол-во записей 422 739



Вот статистика по NULL-ам
Имя поляЗначениеКол-во записей
DIMVAL21NULL 322 840
DIMVAL20NULL 793 950
DIMVAL18NULL 1 960 065
DIMVAL22NULL 1 989 439
DIMVAL16NULL 1 989 878
DIMVAL17NULL 2 016 122
DIMVAL9NULL 3 987 961
DIMVAL10NULL 3 987 961
DIMVAL6NULL 5 335 343
DIMVAL12NULL 7 083 646
DIMVAL7NULL 7 102 488
DIMVAL8NULL 7 450 053
DIMVAL23NULL 7 711 269
DIMVAL15NULL 8 397 702
DIMVAL5NULL 9 358 211
DIMVAL11NULL 9 817 978
DIMVAL24NULL 9 853 996
DIMVAL2NULL 9 954 182
DIMVAL1NULL 9 954 546
DIMVAL14NULL 9 955 326
DIMVAL19NULL 9 963 975
DIMVAL4NULL 9 971 416
DIMVAL3NULL 9 971 822
DIMVAL5NULL 9 972 874
DIMVAL13NULL 9 973 094

тут полная статистика по GroupBy по каждому полю http://1drv.ms/1xOtJ2V
4 апр 15, 23:35    [17474584]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
это по таблице upgrade355_Dim
4 апр 15, 23:36    [17474589]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Grigoriy123,

Попробуйте разбить на несколько запросов.
Простейший вариант:
1)
(
( D.DimVal1 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 ) or 
						 ( D.DimVal1 is null   ) and 
						 ( [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 is null )
					  ) 

Разбиваем на
1.1) D.DimVal1 = [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 - в 1-й запрос
1.2) (D.DimVal1 is null and [$ndo$navlistener].[CompanyName$upgrade355_Dim].DimVal1 is null) - во 2-й запрос

2) пункт 1 + то же самое для DimVal2, итого получается 4 запроса.

Можно делать разбивки по 3, 4 полям, если не лень и если будет такая необходимость. Это с учётом того, что в индексе поля идут по порядку: DimVal1,2,3,4. Соответственно, не вижу смысла делать кучу ключевых полей в индексе. Я бы оставил максимум первые 2-4, а остальные вынес в include (чтобы избавиться от Key Lookup).
По поводу селективности очень здравая мысль. Берём самые селективные поля (1-2-3 штуки), и строим индекс по ним, а остальное в include. Соответственно, пп.1,2 выше выполняем по этим полям, остальные условия оставляем как есть.
4 апр 15, 23:39    [17474600]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Grigoriy123,

сорри, не сразу увидел, что индекс кластерный.

Соберите статистику по upgrade355_DimSetID, мне думается, она будет полезнее. И именно в этой таблице нужно построить максимально правильный индекс. Табличку upgrade355_Dim всё равно будет full scan'ом проходить, т.к. там обновление всех записей.
И не по количеству NULL'ов, а по количеству уникальных значений. И чем их больше, тем лучше. Так что строим список по убыванию (как с NULLами) и пробуем построить уникальный кластерный индекс сначала по самому уникальному полю, потом, если не получится, по первым 2-м, 3-м и т.д., пока не построится. И выполняем злополучный запрос. Желательно с разбивкой на несколько с оглядкой на мой предыдущий пост.
4 апр 15, 23:56    [17474641]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
статистика по DimSetID
Имя поляЗначениеКол-во записей
DIMVAL8RU273863
DIMVAL10THP_CONSUMER148972
DIMVAL10THP_OTHERS106117
DIMVAL15284479
DIMVAL7930067285
DIMVAL15162636
DIMVAL12BS_252142
DIMVAL12DI_251525
DIMVAL10VT_P50977
DIMVAL12PL_247355
DIMVAL7940038074
DIMVAL233031265


ок пробуем уникальный кластерный индекс по DIMVAL8 а потом если не поможет по
DIMVAL8,DIMVAL10
DIMVAL8,DIMVAL10,DIMVAL15
DIMVAL8,DIMVAL10,DIMVAL15,DIMVAL7
5 апр 15, 00:08    [17474672]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
только вот по чему кластерный?

в исходной таблице кластерный уникальный по по полю DimSetID

а индекс с 4 полями DimVal не уникальный и не кластерный
5 апр 15, 00:10    [17474682]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Собственно результат с первой попытки 15 минут

индекс не уникальный не кластерный по полям DIMVAL8,DIMVAL10,DIMVAL15

Время выполнения клиента00:15:47
Статистика по профилю запроса
Количество инструкций INSERT DELETE и UPDATE0
Строки изменяемые инструкциями INSERT DELETE и UPDATE0
Количество инструкций SELECT 4
Строк возвращенных инструкциями SELECT4
Количество транзакций 0
Сетевая статистика
Количество циклов обращения к серверу6
TDS-пакетов отправлено клиентом8
TDS-пакетов получено с сервера26
байтов отправлено клиентом12158
байтов получено с сервера85442
Статистика по времени
Время обработки клиента47
Общее время выполнения62
Время ожидания при ответе сервера15


Большое спасибо Сид!!!

К сообщению приложен файл (3 запрос с индексом.csv - 3Kb) cкачать
5 апр 15, 00:26    [17474711]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Grigoriy123,

в плане выполнения написано: Clustered index seek. Собственно, его и надо искать в upgrade355_DimSetID. На индексы в табличке upgrade355_Dim особого внимания не обращаем. А лучше - заскриптовать индексы, сделать update, а потом создать заново. Ибо при апдейте, если обновляемое поле где-то участвует, получается просадка ещё и на обновлении индекса.

По поводу построения индекса: НЕПРАВИЛЬНО! Смотрим количество УНИКАЛЬНЫХ значений в поле!

Но, раз получилось, очень рад, что так тоже помогло)))))))))))))))))))
5 апр 15, 00:31    [17474721]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
индекс в upgrade355_DimSetID не кластерный не уникальный с полями DIMVAL8,DIMVAL10,DIMVAL15 все остальные dimval в include.

Про кол-во уникальных значение понял (чем больше тем лучше) т.е. при обходе дерева индекса на последней ветке остается минимум записей. Я сделал по кол-ве в группе. Переделаю проверю, но завтра.
5 апр 15, 00:55    [17474790]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
я наверное что не понимаю, начал исправлять свою ошибку и пришол к результату 12 часов. Мои действия:
1) Select 'DIMVAL1',[Dimval1],count(*)
from update355$DimSetID
group by [DimVal1]
union
select по остальным DimVal c 2 по 24
2) все в Excel
3) Строю сводную DIMVAL1(константа) в строках, в значениях сводной уникальные данные из поля DimVal (Сильно не пинайте наверное все в запросе можно было сделать)

4) результат
Названия строкКоличество по полю Значение
DIMVAL1769616
DIMVAL1617829
DIMVAL91438
DIMVAL23177
DIMVAL7116
DIMVAL2038
DIMVAL126
DIMVAL524


5) индекс не кластерный не уникальный по таблице update355$DimSetID поля DIMVAL17,DIMVAL16,DIMVAL9 все остальные в include
6)результат 12 часов
7) прочитал что в плане смотреть на |--Clustered Index Seek(OBJECT:([VKM_6R2].[$ndo$navlistener].[VKM Transmissions Ltd$upgrade355_DimSetID].[VKMTransmissionsLtd$pk_dim355_id] AS [D]), SEEK:([D].[ID]=[VKM_6R2].[$ndo$navlistener].[VKM Transmissions Ltd$upgrade355_DimSetID].[ID] as [D].[ID]) LOOKUP ORDERED FORWARD)

добавил поле ID в этот индекс 4 полем не вышло результат то же
добавил его в include тоже глухо

Что я делаю не так?
почему ключ DIMVAL8,DIMVAL10,DIMVAL15 и все остальное в Include дает 15 минут???
Хочу понимать что происходит, а не просто довольствоваться шарой!
5 апр 15, 13:02    [17475467]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
вот кол-во уникальных значений по ключ DIMVAL8,DIMVAL9,DIMVAL15 с результатом 15 минут

Названия строкКоличество по полю Значение
DIMVAL91438
DIMVAL821
DIMVAL155
5 апр 15, 13:08    [17475481]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Самое ужасное, что сервак перегрузился и выдти обратно на 15 минут у меня не получается. При тех же условиях идет 13 часов.
Ребята нужна помощь!
5 апр 15, 14:18    [17475624]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
Grigoriy123
P.S. Запрос писал не сам, это процедура предоставлена Microsoft для обновления ERP с одной версии на другую.
То есть запрос поменять нельзя, он "вшит" в программу, и можно только пытаться строить всяческие индексы?
5 апр 15, 14:33    [17475648]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
alexeyvg
Grigoriy123
P.S. Запрос писал не сам, это процедура предоставлена Microsoft для обновления ERP с одной версии на другую.
То есть запрос поменять нельзя, он "вшит" в программу, и можно только пытаться строить всяческие индексы?


Запрос поменять можно, код доступен.
5 апр 15, 14:40    [17475658]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Grigoriy123
Ребята нужна помощь!
План выложите в нормальном виде - в формате sqlplan.
5 апр 15, 14:55    [17475686]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
Grigoriy123
alexeyvg
пропущено...
То есть запрос поменять нельзя, он "вшит" в программу, и можно только пытаться строить всяческие индексы?


Запрос поменять можно, код доступен.
Тогда можно так сделать:

create view  [$ndo$navlistener].vwCompanyName$upgrade355_Dim
with schemabinding
as
select	
		[Table ID],
		[Entry No_],
		[DimSetID],
		[DimVal1],
		[DimVal2],
		[DimVal3],
		[DimVal4],
		[DimVal5],
		[DimVal6],
		[DimVal7],
		[DimVal8],
		[DimVal9],
		[DimVal10],
		[DimVal11],
		[DimVal12],
		[DimVal13],
		[DimVal14],
		[DimVal15],
		[DimVal16],
		[DimVal17],
		[DimVal18],
		[DimVal19],
		[DimVal20],
		[DimVal21],
		[DimVal22],
		[DimVal23],
		[DimVal24],
		isnull([DimVal1], 'null') + '*' +
		isnull([DimVal2], 'null') + '*' +
		isnull([DimVal3], 'null') + '*' +
		isnull([DimVal4], 'null') + '*' +
		isnull([DimVal5], 'null') + '*' +
		isnull([DimVal6], 'null') + '*' +
		isnull([DimVal7], 'null') + '*' +
		isnull([DimVal8], 'null') + '*' +
		isnull([DimVal9], 'null') + '*' +
		isnull([DimVal10], 'null') + '*' +
		isnull([DimVal11], 'null') + '*' +
		isnull([DimVal12], 'null') + '*' +
		isnull([DimVal13], 'null') + '*' +
		isnull([DimVal14], 'null') + '*' +
		isnull([DimVal15], 'null') + '*' +
		isnull([DimVal16], 'null') + '*' +
		isnull([DimVal17], 'null') + '*' +
		isnull([DimVal18], 'null') + '*' +
		isnull([DimVal19], 'null') + '*' +
		isnull([DimVal20], 'null') + '*' +
		isnull([DimVal21], 'null') + '*' +
		isnull([DimVal22], 'null') + '*' +
		isnull([DimVal23], 'null') + '*' +
		isnull([DimVal24], 'null') as DimVal
from [$ndo$navlistener].[CompanyName$upgrade355_Dim]
go
create unique clustered index IX_vwCompanyName$upgrade355_Dim on [$ndo$navlistener].vwCompanyName$upgrade355_Dim (DimVal, [Table ID], [Entry No_])
go

create view [$ndo$navlistener].vwCompanyName$upgrade355_DimSetID
with schemabinding
as
select	[DimSetID],
		[DimVal1],
		[DimVal2],
		[DimVal3],
		[DimVal4],
		[DimVal5],
		[DimVal6],
		[DimVal7],
		[DimVal8],
		[DimVal9],
		[DimVal10],
		[DimVal11],
		[DimVal12],
		[DimVal13],
		[DimVal14],
		[DimVal15],
		[DimVal16],
		[DimVal17],
		[DimVal18],
		[DimVal19],
		[DimVal20],
		[DimVal21],
		[DimVal22],
		[DimVal23],
		[DimVal24],
		[ID],
		isnull([DimVal1], 'null') + '*' +
		isnull([DimVal2], 'null') + '*' +
		isnull([DimVal3], 'null') + '*' +
		isnull([DimVal4], 'null') + '*' +
		isnull([DimVal5], 'null') + '*' +
		isnull([DimVal6], 'null') + '*' +
		isnull([DimVal7], 'null') + '*' +
		isnull([DimVal8], 'null') + '*' +
		isnull([DimVal9], 'null') + '*' +
		isnull([DimVal10], 'null') + '*' +
		isnull([DimVal11], 'null') + '*' +
		isnull([DimVal12], 'null') + '*' +
		isnull([DimVal13], 'null') + '*' +
		isnull([DimVal14], 'null') + '*' +
		isnull([DimVal15], 'null') + '*' +
		isnull([DimVal16], 'null') + '*' +
		isnull([DimVal17], 'null') + '*' +
		isnull([DimVal18], 'null') + '*' +
		isnull([DimVal19], 'null') + '*' +
		isnull([DimVal20], 'null') + '*' +
		isnull([DimVal21], 'null') + '*' +
		isnull([DimVal22], 'null') + '*' +
		isnull([DimVal23], 'null') + '*' +
		isnull([DimVal24], 'null') as DimVal
from [$ndo$navlistener].[CompanyName$upgrade355_DimSetID]
go
create unique clustered index IX_vwCompanyName$upgrade355_DimSetID on [$ndo$navlistener].vwCompanyName$upgrade355_DimSetID (DimVal, [ID])
go


UPDATE U
SET [DimSetID] = D.DimSetID   
FROM [$ndo$navlistener].[vwCompanyName$upgrade355_Dim] U
	JOIN [$ndo$navlistener].[vwCompanyName$upgrade355_DimSetID] as D 
		ON D.DimVal = U.DimVal


Единственная трудность может быть в том, что в таблице [$ndo$navlistener].vwCompanyName$upgrade355_Dim
сочетание полей [Table ID], [Entry No_] и всех DimVal* может быть неуникально, тогда нужно ещё попробовать варианты

Вьюхи, естественно, потом можно удалить
5 апр 15, 15:05    [17475711]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
alexeyvg
Единственная трудность может быть в том, что в таблице [$ndo$navlistener].vwCompanyName$upgrade355_Dim
сочетание полей [Table ID], [Entry No_] и всех DimVal* может быть неуникально, тогда нужно ещё попробовать варианты
СОвсем идеально, если DimVal в обоих вьюхах будет уникально. Тогда соответственно в определеннии индексов на вьюхи нужно оставить только поле DimVal, и запрос будет выполняться быстрее.

Можно так сначала попробовать, если будет ошибка нарушения уникальности, добавить поля.
5 апр 15, 15:09    [17475716]     Ответить | Цитировать Сообщить модератору
 Re: как ускорить update. В плане 20 часов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31427
alexeyvg
UPDATE U
SET [DimSetID] = D.DimSetID   
FROM [$ndo$navlistener].[vwCompanyName$upgrade355_Dim] U
	JOIN [$ndo$navlistener].[vwCompanyName$upgrade355_DimSetID] as D 
		ON D.DimVal = U.DimVal

А, и ещё нужно на всякий использовать хинт NOEXPAND:
UPDATE U
SET [DimSetID] = D.DimSetID   
FROM [vwCompanyName$upgrade355_Dim] U
	JOIN [vwCompanyName$upgrade355_DimSetID] as D  (NOEXPAND)
		ON D.DimVal = U.DimVal
5 апр 15, 15:19    [17475731]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить