MS SQL on multi-processor computer

User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Post by roadman »

YellowMan wrote:Так человек же писал что не видит нагрузки на диск в момент простоя...
Хорошо бы код посмотреть и планы. И блокировки в момент задумчивости.

ЗЫ
А что такое bulk select ?

Это когда вы готовите буффер для bind не на одну строчку, а на 1000, скажем для примера, конфигурируя ODBC driver
SQLSetStmtAttr(m_hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (void*)m_Bulk_Size, 0);
::SQLSetStmtAttr(m_hstmt, SQL_ATTR_ROWS_FETCHED_PTR, &row_count, 0);
Тогда select идет намного быстрее, 100Мб за 2-3 секунды, если буфер порядка 10Мб.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: MS SQL on multi-processor computer

Post by tengiz »

roadman,

В SQL Server есть общепринятый жаргон, в котором bulk insert означает не что иное как bulk insert statement. Когда говорят о каком-либо способе оптимизированной массовой загрузки данных без уточнения о каком именно, то обычно говорят bulk load - что означает, что данные загружаются либо через bulk copy program (bcp), либо через bcp_api, либо через IRowsetFastLoad либо через bulk insert statement.

...поэтому bcp_done команда имеет прямое отношение к commit. Принудительно я его для bulk insert не делаю, потому как bcp библиотека этого функционала не предоставляет.

bcp_done и есть не что иное как промежуточный commit.
затем пробегаю по всем измененным строчкам в памяти и делаю update update команда выполняется через обычный ODBC statement "update table set .... where ....", после каждой команды выполняется commit

затем пробегаю по строчкам, помеченным как удаленные и выполняю обычный ODBC statement "delete from table .... where ...". после каждой команды выполняется commit

Ваша проблема именно здесь и зарыта. Такой сценарий создаёт дикую нагрузку на дисковое устройство, на котором расположен журнал, при условии, что кеширование на запись отключено. Кроме того, не стоит делать массовые изменения строк изменяя их одну за другой отдельными командами - воспользуйтесь @@rowсount для ограничения количества изменяемых отдельной комадной строк, если другого удобного способа нет (намример, изменять диапазон ключей).
По поводу частых commit - то же наверное стоит попробовать, если это напрямую связано с кешированием диска. Как по вашему, господа, какое количество строк(байт?) было бы приемлемым в одном блоке транзакций 10, 100, ..., 1000 000?

Это зависит о размера строки, начните с сотни строк, сделайте измерения, а затем увеличьте это количество, скажем, до тысячи. Как только итоговая производительнось перестанет расти или наоборот пойдёт вниз - Вы выскочили за оптимальный размер пакета.
Cheers
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Re: MS SQL on multi-processor computer

Post by roadman »

tengiz wrote:В SQL Server есть общепринятый жаргон.

Мои извинения за незнания общепринятого жаргона. Теперь буду знать.

Это зависит о размера строки, начните с сотни строк, сделайте измерения, а затем увеличьте это количество, скажем, до тысячи. Как только итоговая производительнось перестанет расти или наоборот пойдёт вниз - Вы выскочили за оптимальный размер пакета.

ОК, будем экспериментировать.

Спасибо всем за brain-storm, о результатах доложу.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: MS SQL on multi-processor computer

Post by tengiz »

Merle wrote:Но сиквел же работает с файлами через FILE_FLAG_WRITE_THROUGH, и при этом все системное кеширование идет лесом, если я правильно понимаю...

Это разные кеши - есть кеш файловых систем, интегрированный в подсистему виртуальной памяти ОС, и есть кеши драйверов устройств, а также кеши самих устройств.
Cheers
User avatar
roadman
Уже с Приветом
Posts: 707
Joined: 12 Mar 2003 22:29
Location: Moscow->Bay Area, CA

Re: MS SQL on multi-processor computer

Post by roadman »

tengiz wrote:Ваша проблема может быть в именно этом - в Windows для IDE дисков по умолчанию включено кеширование записи, поэтому частые commit после каждой строки (если Вы действительно так делаете) не создают сликом большой нагрузки. Проверьте, выключено ли кеширование записи для SCSI диска на новой машине. Но если выключено, то я бы не советовал включать. Правильное решение - не делать слишком частых commit.


Only today I was able to get to the server computer and check - what's going on here.
Thanks tengiz, as Joker predicted in our private conversation :wink: your advice was the most comprehensive and precise. On a SCSI disk the write-cache was disabled and even more - I didn't find how to make it enable. And follow you guides I changed block of rows prepared for update/delete operations from 1 to 1000 and MS SQL picked up to 50% of CPU time and sometimes grabed the second free CPU. The total result - program is flying like a rocket.
Thanks again, I really appreciate ALL advices I got here.
The philosophy of one century is the common sense of the next. --Henry Ward Beecher
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: MS SQL on multi-processor computer

Post by tengiz »

My regards to Joker :)
Cheers

Return to “Вопросы и новости IT”