Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Изменение большого количества записей в таблице

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
alnik-75
Отправлено: 05 Декабря, 2014 - 19:57:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




Добрый вечер!
Имеется таблица, в которой около 2000 записей. Определенное поле, изначально пустое, каждой записи необходимо изменить. Каждое изменение будет уникально для всех этих 2000 записей.

Вопрос. Необходимо делать 2000 запросов update? Или можно как то оптимизировать этот процесс?

Заранее спасибо
 
 Top
Мелкий Супермодератор
Отправлено: 05 Декабря, 2014 - 20:41:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Варианты:
0) да, толпа апдейтов. По-возможности, завернуть в транзакцию. По-возможности, одним prepared statement
1) insert on duplicate key update
2) insert во временную таблицу, затем кросстабличный апдейт.


-----
PostgreSQL DBA
 
 Top
alnik-75
Отправлено: 05 Декабря, 2014 - 20:47:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




Спасьббо. Буду изучать предложенные варианты
 
 Top
MiksIr
Отправлено: 05 Декабря, 2014 - 20:50:38
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


0) зачем транзакцию? только зря держать строчки заблокированными


-----
self-banned
 
 Top
Мелкий Супермодератор
Отправлено: 05 Декабря, 2014 - 20:53:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MiksIr пишет:
зачем транзакцию?

Транзакция - вещь, выполняющая много медленных операций.
Одна транзакция очень значительно быстрее 2000 транзакций.


-----
PostgreSQL DBA
 
 Top
MiksIr
Отправлено: 05 Декабря, 2014 - 21:06:20
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Если важна скорость, 2-й вариант и все.

А в нулевом, транзакция, несомненно, ускорит операцию, но и поставит раком конкурентность. Человека предупредить можно.

2000 записей, конечно, копеечные затраты, а вот было бы на три-четыре порядка больше - и всю базу можно положить от обилия локов ;)


-----
self-banned
 
 Top
Мелкий Супермодератор
Отправлено: 06 Декабря, 2014 - 11:18:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MiksIr пишет:
но и поставит раком конкурентность

Все три варианта потребуют явный или неявный эксклюзивный лок на весь обновляемый массив данных. Разница только в том, сколько по времени этот лок будет стоять.

MiksIr пишет:
на три-четыре порядка больше

А можно просто из любопытства - что за задача, требующая 2-20млн обновлений строк за раз?


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Декабря, 2014 - 12:12:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
А можно просто из любопытства - что за задача, требующая 2-20млн обновлений строк за раз?
Мне тоже интересно. Просим!
 
 Top
MiksIr
Отправлено: 06 Декабря, 2014 - 16:20:24
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Мелкий пишет:
Все три варианта потребуют явный или неявный эксклюзивный лок на весь обновляемый массив данных. Разница только в том, сколько по времени этот лок будет стоять.

Разница в том, что если без транзакции - то будет дольше, но за раз более одной строчки лочится не будет.
А если лочить все, то нужно выбирать наиболее быстрый вариант, а это третий.

Мелкий пишет:
А можно просто из любопытства - что за задача, требующая 2-20млн обновлений строк за раз?

Не знаю ;) Но несколько сотен тысяч запросто - большие интернет магазины, обновление цен, если они разом меняются из-за курса валюты и т.п.
Не говоря уж о том, что часто заказчики просто не готовы (не могут технически) выгружать только измененные артикулы и делается полная выгрузка их товаров на сайт.


-----
self-banned
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB