Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Надо сделать update таблицы в 5 миллионов рекордов, на основании другой таблицы, с выборкой данных из 4-х других таблиц. Все таблицы порядка от миллиона рекордов до шести миллионов.
Индехы можно переделать, пока мой наилучший вариант с курсором займёт по подсчётам 15 дней, не годится.
Что посоветует уважаемое сообщество?
24 июл 09, 19:47    [7458954]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
А select
?
на основании другой таблицы, с выборкой данных из 4-х других таблиц
сколько займет "по подсчётам"?
24 июл 09, 19:51    [7458963]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Select из одной таблицы быстро, когда пытаюсь собрать "сразу всё" -просто зависает, трудно сказать может часов через 20 что и появится, но я так долго не ждала.
24 июл 09, 19:56    [7458970]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а можно поподробнее - зачем такое понадобилось?
что вообще за задача?
24 июл 09, 20:00    [7458981]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Исправление уже существующих данных, на основании изменений внесённых другим вендором. Удалять ничего нельзя, всё уже в производстве.
24 июл 09, 20:11    [7459008]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Кроме как переименовать таблицу с созданием вместо нее вьюхи
ничего другого мне в голову не приходит
24 июл 09, 20:15    [7459015]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
И как это ускорит процесс?
На постоянку вьюху нельзя, слишком много разного софта вытягивает данные из этой таблицы, как-то надо именно её апдейтнуть.
24 июл 09, 20:18    [7459024]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
?
На постоянку вьюху нельзя
тогда надо садиться и разбираться
написать запрос с 2 таблицами, но не запускать а глянуть предварительный план
добавить в запрос 3 таблицу, глянуть предварительный план...
на каждом шаге думать - может, какой индекс создать, или может, как-то изменить существующие...
может даже как-то переписать условия соединения

существует вероятность, что сможете сделать, чтобы update прошел быстрее
какова вероятность - не знаю...

к сожалению, в пятницу вечером помогать Вам в этом всем возможности не имею,
но надеюсь, что указал правильный путь
удачи
24 июл 09, 20:27    [7459048]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Сейчас я вас испугаю наверно.
А как можно посмотреть предварительный план?
Как оценить какой индех будет быстрее работать, один по пяти колонкам или пять по одной? Есть ли какие-то общие правила?
24 июл 09, 20:46    [7459093]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
1) Как получить план выполнения запроса в текстовом виде?
2) А сейчас я Вас испугаю
Я в оптимизации не специалист, мои познания ограничены прочтением книги Настройка SQL для профессионалов
(знаю, отношение к книге в обществе неоднозначное, но мне лично она понравилась, и, главное, не раз помогла)
ну и само собой простейшими навыками насчет "чего нельзя делать чтобы индекс не подавить"
(поиск по выражению там ну или Like с процентиком впереди и все такое)

Я, конечно, в курсе, что в MSDN куча инфы на тему оптимизации
Да все руки до нее не доходят как-то, столько всего другого осваивать приходится, аж страшно
24 июл 09, 20:55    [7459111]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Я бы делал так: материализовал бы выборку из четырех таблиц в одну таблицу (временную или постоянную), чтобы не было фокусов с кривыми планами, далее бы апдейтил нужную таблицу порциями скажем, тыщ по 100 записей в отдельных транзакциях.
24 июл 09, 21:02    [7459121]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
И это то что я сейчас путаюсь делать, просто не верится что ничего лучшего на самом деле нет.
А как это делать по 100 записей? Ручками?!
24 июл 09, 21:06    [7459127]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
да, всего 50 тыщ раз по 100 записей ручками, и мы с встретимся с Вами лет через 5...

для спящего время бодрствования равносильно сну
24 июл 09, 21:14    [7459136]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Неет! Меня к тому времени уволят.
Так что встретимся гораздо раньше.
А серьёзно, как их пачками автоматически запускать? Я даже не знаю как это будет называться, что-бы погуглить.
Не DBA я, простой программист, на которого вот такое вот повесили.
24 июл 09, 21:25    [7459156]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
?
А серьёзно, как их пачками автоматически запускать?
Примерно так
USE [tempdb]
GO

IF OBJECT_ID('BigTable') IS NOT NULL
	DROP TABLE [BigTable]
GO

CREATE TABLE [BigTable](
	id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
	SomeData INT NOT NULL
)
GO

	DECLARE @i INT
	SET @i = 1
	
	WHILE @i <= 10000 BEGIN
		INSERT INTO [BigTable] ([SomeData]) VALUES (@i + 12345) 
		SET @i = @i + 1
	END
	
	SELECT COUNT(*) FROM [BigTable]
GO
	
	DECLARE @i INT
	SET @i = 0
	
	WHILE @i <= 10000 BEGIN
		UPDATE [BigTable] SET [SomeData] = SomeData - 12345
		WHERE [BigTable].[id] BETWEEN @i AND @i + 99
		SET @i = @i + 100 -- 100 - размер пакета обновления
	END
GO
Вместо столбца [id] подойдет любой уникальный. Хотя... уникальность необязательное свойство.
Еще имеет смысл перед обновлением поменять модель восстановления БД на Simple, если была Full.
24 июл 09, 21:56    [7459209]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Спасибо.
24 июл 09, 22:07    [7459232]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Senya_L
Еще имеет смысл перед обновлением поменять модель восстановления БД на Simple, если была Full.
За следование подобным советам могут уволить еще раньше.
24 июл 09, 22:19    [7459264]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Гавриленко Сергей Алексеевич
Senya_L
Еще имеет смысл перед обновлением поменять модель восстановления БД на Simple, если была Full.
За следование подобным советам могут уволить еще раньше.
Могут. Но при Full выгода от UPDATE'а "пачками" будет минимальной. О допустимости временной смены модели восстановления пусть на месте принимают решение. Отсюда не видно, как-то :)
24 июл 09, 22:41    [7459308]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Я-ж не DBA, кто мне даст такие изменения делать.
Спасибо, пошла читать, что такое модель восстановления и чем черевато её изменение...
24 июл 09, 22:49    [7459327]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
Гавриленко Сергей Алексеевич
Я бы делал так: материализовал бы выборку из четырех таблиц в одну таблицу (временную или постоянную), чтобы не было фокусов с кривыми планами, далее бы апдейтил нужную таблицу порциями скажем, тыщ по 100 записей в отдельных транзакциях.

+1
Ну и навремя обновления отключил/удалил бы ненужные для данной операции индексы.
24 июл 09, 23:36    [7459453]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
ererererer1
Guest
конечно можно индексы убрать - при апдейте скан всей таблицы как я понял. при этом сделать лок всей таблицы
при селекте же надо наоборот - нужные индексы сделать - по которым идет выборка.
желательно обойтись без курсоса - множественные операции.
можно пачками делать
25 июл 09, 12:19    [7459898]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
такой вопрос, проапдейдить надо всю таблицу? или только часть?
далее, какой аппаратный сервер? какой характер нагрузки на базу?
после этого можно что-то рекомендовать осмысленное.
25 июл 09, 14:09    [7460017]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
AAron
такой вопрос, проапдейдить надо всю таблицу? или только часть?
далее, какой аппаратный сервер? какой характер нагрузки на базу?
после этого можно что-то рекомендовать осмысленное.
Чтобы что-то осмысленное рекомендовать надо быть на месте событий.
25 июл 09, 17:40    [7460194]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
?
Guest
Изменения будут примерно на 5-ти миллионах рекордов из 6-ти.
В таблице из которой выбираем надо поставить ID рекорда, который был изменён, на его основании. Есть уникальные ID в обеих таблицах.
В производстве SQL2005, сейчас у меня для тестирования 2000, на время апдейта базу можно будет закрыть, сервер закрыть не удасться.
25 июл 09, 22:11    [7460462]     Ответить | Цитировать Сообщить модератору
 Re: update таблицы в 5 миллионов рекордов, на основании другой таблицы  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
Senya_L
AAron
такой вопрос, проапдейдить надо всю таблицу? или только часть?
далее, какой аппаратный сервер? какой характер нагрузки на базу?
после этого можно что-то рекомендовать осмысленное.
Чтобы что-то осмысленное рекомендовать надо быть на месте событий.

боюсь, автору никто не позволит пригласить "кого-то с форума" для решения такой проблемы
26 июл 09, 00:36    [7460735]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить