powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
7 сообщений из 7, страница 1 из 1
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40054480
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Занимаюсь сокращением времени выполнения длинной обработки.
Дано:
Есть таблица, на 300млн записей, на таблице есть поле PartNumber, те это условная партиция в таблице, есть хранимая процедура, которая каждую ночь апдейтит множество записей в этой таблице:
Индексы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
ALTER TABLE [dbo].[tblSuperMainFull_V2] ADD  CONSTRAINT [PK_tblSuperMainFull_V2] PRIMARY KEY CLUSTERED 
(
	[Book_ID] ASC,
	[PT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ix_Book] ON [dbo].[tblSuperMainFull_V2]
(
	[Book_ID] ASC
)
INCLUDE([Parent_ID_Dep]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ix_PartNumber] ON [dbo].[tblSuperMainFull_V2]
(
	[PartNumber] ASC
)
INCLUDE([PT_ID],[Book_ID]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ix_PT_ID_incl_Book] ON [dbo].[tblSuperMainFull_V2]
(
	[PT_ID] ASC
)
INCLUDE([Book_ID]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO



Хранимка содержит последовательное выполнение подобных циклов:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @PN int = 1, @maxpn int = 10
	while @PN <= @maxpn
	begin
		update F 
		set Zak_N = iif(Remainder = 0, 1, abs(Remainder))
		from dbo.tblSuperMainFull_V2 F 
		where Shop_Category <= Book_CategoryN and Shop_PowerCalc >= Book_Power and Book_CategoryN <= 11 and Remainder <= 0
		and PartNumber = @PN
		set @PN+=1
end



В момент выполнения данной обработки подразумевается, что с данными никто не работает, от сюда не ясна вся эта пляска с PartNumber, не уверен, что последовательно 10 раз выполнить апдейт 10 частей эффективней, чем 1 раз или я не прав?

Задача: ускорить выполнение данной обработки.

Первое, что приходит на ум - это параллельно выполнять обработки из подобных циклов, в рамках одной таблицы параллельные сессии могут работать с одними и теми же страницами и вызывать блокировки. Поможет ли нарезка этой большой таблицы на 10 отдельных таблиц, 1 таблица для 1 PartNumber, смогу ли я применять апдейты на все таблицы обращаясь к view?

Например:

Код: sql
1.
2.
3.
4.
-- Обнуляем всех 
	update dbo.tblSuperMainFull_V2
	set ZAK_2=0 , ZAK_G=0, ZAK_N=0, ZAK_NP=0, ZAK_R=0, ZAK_NM=0, ZAK_NN=0, ZAK_K=0
	where ZAK_2!=0 or ZAK_K!=0 or ZAK_G!=0 or ZAK_NP!=0



Будет ли равноценно работать в таком виде?

Код: sql
1.
2.
3.
4.
-- Обнуляем всех 
	update dbo.view_SuperMainFull_V2
	set ZAK_2=0 , ZAK_G=0, ZAK_N=0, ZAK_NP=0, ZAK_R=0, ZAK_NM=0, ZAK_NN=0, ZAK_K=0
	where ZAK_2!=0 or ZAK_K!=0 or ZAK_G!=0 or ZAK_NP!=0



Может быть вы совершенно по другому подошли бы к решению задачи, поделитесь мнением.
Спасибо.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40054496
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы совершенно по другому подошел бы к решению задачи.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40054538
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

PartNumber какой тип данных имеет?
В этом есть смысл, которые проверяется на практике с секундомером - более короткие транзакции и менее ёмкие предпочтительнее при многопользовательской работе или при ограниченных ресурсах.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40054570
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов

PartNumber какой тип данных имеет?


PartNumber int

Владислав Колосов
более короткие транзакции и менее ёмкие предпочтительнее при многопользовательской работе или при ограниченных ресурсах.


Да, но в этом конкретном случае сервер отключает от себя все соединения и занимается расчетом, все ресурсы в его распоряжении.

Поэтому и возникло подозрение, что все пляски с делением на куски с первого взгляда выглядят не очень эффективными.

Вчера добавил флаги внутри процедуры и выяснилось, что самый долгий кусок когда выглядит вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
update SM set 
		Shop_Category = S.Value
	from [db_Partners].[dbo].[ParamByTBKValues] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod1
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id = 1 and Shop_Category != S.Value --and len(TbkCode)=3

	update SM set 
		Shop_Category = S.Value
	from [db_Partners].[dbo].[ParamByTBKValues] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod2
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id = 1 and Shop_Category != S.Value --and len(TbkCode)=4

	update SM set 
		Shop_Category = S.Value
	from [db_Partners].[dbo].[ParamByTBKValues] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod3
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id = 1 and Shop_Category != S.Value --and len(TbkCode)=5

	update SM set 
		Shop_Category = S.Value
	from [db_Partners].[dbo].[ParamByTBKValues] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod4
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id = 1 and Shop_Category != S.Value --and len(TbkCode)=6

	update SM set 
		Shop_Power = ceiling(S.[Power])
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod1
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 1 and sm.Shop_Power != S.[Power]

	update SM set 
		Shop_PowerCalc = S.PowerCalc
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod1
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 1 and sm.Shop_PowerCalc != S.PowerCalc

if (month(getdate())=8 and DAY(getdate())>=16) or month(getdate())in (9,10) 

	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod1
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=2 and Shop_PowerCalc!=S.Value --and len(TbkCode)=3
else
	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod1
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=3 and Shop_PowerCalc!=S.Value --and len(TbkCode)=3

	update SM set 
		Shop_Power = ceiling(S.[Power])
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod2
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 2 and sm.Shop_Power != S.[Power]

	update SM set 
		Shop_PowerCalc = S.PowerCalc
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod2
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 2 and sm.Shop_PowerCalc != S.PowerCalc

if (month(getdate())=8 and DAY(getdate())>=16) or month(getdate())in (9,10) 

	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod2
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=2 and Shop_PowerCalc!=S.Value --and len(TbkCode)=4
else
	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod2
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=3 and Shop_PowerCalc!=S.Value --and len(TbkCode)=4

	update SM set 
		Shop_Power = ceiling(S.[Power])
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod3
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 3 and sm.Shop_Power != S.[Power]

	update SM set 
		Shop_PowerCalc = S.PowerCalc
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod3
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 3 and sm.Shop_PowerCalc != S.PowerCalc

if (month(getdate())=8 and DAY(getdate())>=16) or month(getdate())in (9,10) 

	update SM set 
		Shop_PowerCalc = S.Value, 
		Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod3
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=2 and Shop_PowerCalc!=S.Value --and len(TbkCode)=5
else
	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod3
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=3 and Shop_PowerCalc!=S.Value --and len(TbkCode)=5

	update SM set 
		Shop_Power = ceiling(S.[Power])
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod4
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 4 and sm.Shop_Power != S.[Power]

	update SM set 
		Shop_PowerCalc = S.PowerCalc
	from [db_Partners].[ors].[ParamByTBK] S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod4
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID = S.PT_ID and T.BookID = SM.Book_ID
	where s.level = 4 and sm.Shop_PowerCalc != S.PowerCalc

if (month(getdate())=8 and DAY(getdate())>=16) or month(getdate())in (9,10) 

	update SM set 
		Shop_PowerCalc = S.Value, 
		Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode = T.Cod4
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=2 and Shop_PowerCalc!=S.Value --and len(TbkCode)=6
else
	update SM
	set Shop_PowerCalc=S.Value, Shop_Power=ceiling(s.Value)
	from [db_Partners].[dbo].[ParamByTBKValues]  S with(nolock) 
	inner join dbo.ТБК4 T with(nolock) on S.TbkCode=T.Cod4
	inner join dbo.tblSuperMainFull_V2 SM on SM.PT_ID=S.PartnerId and T.BookID=SM.Book_ID
	where id=3 and Shop_PowerCalc!=S.Value --and len(TbkCode)=6



Что с этими многочисленными апдейтами сделать можно я не понимаю

Модератор: Портяночки в тег спойлер пакуйте, пожалуйста.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40054647
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

на первый взгляд имеются совершенно одинаковые части. Придётся в логике Вам покопаться.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40055195
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,
я б для начала разобрался в логике

могу подать идею к-я может прокатить ( Но может и НЕ прокатить )

Если таблица dbo.tblSuperMainFull_V2 в жойнах использцется как-то НЕ целиком
(скажем за месяц) - то возможно

selecе into #Tmp1 where date between...
(и взожмно даже НЕ весь набор полей - а тольк нужный )
сделать по ней индексы (нужные)
сделать резльутируюшую таблицу #Tmp_res и запихнуть ее назад в tblSuperMainFull_V2
может получиться быстрей

скажем такая идея прокатывала у меня давно для примитивного биллинга за месяц

Ежели данные tblSuperMainFull_V2 используются ВСЕ - то увы не прокатит
и все равно надо смотреть логику.
...
Рейтинг: 0 / 0
Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
    #40055200
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор,

Кстати может сработать, tblSuperMainFull_V2 логически разделена на 10 частей и работа в основном идет с частами.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли смысл переходить с 1й большой таблицы на 10 поменьше?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]