powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / О вреде транзакций, или "Как же отключить transaction log?"
40 сообщений из 40, показаны все 2 страниц
О вреде транзакций, или "Как же отключить transaction log?"
    #32197808
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конференции по MS SQL был вопрос, как же все таки отключить transaction log. Правда, вопрошающего сразу запинали, сказали, что он в корне не прав, и лог - это правильно. Вопрощающий сказал - Ладно, пусть не всегда, а иногда отключать, я ДБА, я лучше знаю, нужен он или нет. Ему сказали - гнать таких ДБА, лог - это свято, без него нельзя.
Наверное, меня тоже гнать надо, но мне лог мешает.
вот к примеру...
У нас есть база, достаточно большая. По ней, естественно, надо строить отчеты. Большие и сложные. За один проход не считаются, а требуют создания большого количества промежуточных результатов.
Обычно в таких случаях создают временную табличку, промежуточные результаты складывать. И всем по большому счету плевать, если при работе с этой временной табличкой произойдет ошибка (не вставилось все или не все удалилось) - просто ловят ошибку и выходят из процедуры. Она ведь временная, и так дропнется по выходу из области видимости - кому она нужна?!
А у нас в качестве временных табличек используются постоянные (удобнее нам так). И мне все равно, если при удалении из этой таблички произойдет ошибка и удалятся не все данные - я ловлю ошибку и просто выхожу из процедуры. Тоже самое при вставке. Ну не волнует меня непротиворечивость данных в этих табличках - они по смыслу временные. Но! Я вынужден тратить дисковое пространство под лог(а места на диске не так уж и много), я вынужден терпеть накладные расходы на обслуживание лога (а сервер - не бесконечной мощности), я вынужден терпеть взаимоблакировки пользователей (а вдруг кто-то поменяет данные! ой!) и т.д.
Поэтому так и тянуться руки отключить лог - а НЕКАК!!!! А хочется....
И вообще, что это за механизм транзакций такой?
Почему переход на следующий уровень вложенности вверх или вниз так различается? Почему я должен об этом помнить? "так, здесь - begin tran, тут - save tran..."?
Почему нельзя открыть две паралельные транзакции в одном коннекте? В одной (маленькой и быстрой) получать номер документа, во второй (большой и медленной) создавать спецификацию документа? Почему кто-то должен ждать момента, пока другой не отпустит давно ненужный ему ресурс?
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32197849
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри - немножно не в тему, но вспомнилось вот, как меня глобальные темповые таблицы в Sybase ASA прикололи: создается глобальная темповая таблица, причем описание ее структуры хранится в БД. Любой коннект, который подцепляется к БД ее сразу видит, даже из Enterprice Manager, причем как полноценную таблицу, правда на ней значек специальный, указывающий, что она временная. Пока ее не дропнешь, она так в БД и остается существовать. Для каждого коннекта в ней будут хранятся свои данные. Ей можно указать как она будет обнуляться - при commit или при завершении соединения. Хоть структура и хранится в БД, но данные такая табличка хранит в темповой БД и в транзакциях не участвует, поэтому скорость работы с ней приятная, блокировки естественно отсутствуют, раз она получается разделена между пользователеми. Очень мне даже эти таблички помогли как раз в первую очередь для отчетов. Ну а по существу - нельзя наверное все таки в БД лог отключать, целостность данных гораздо важнее скорости. В принципе если так подумать, кто Вам мешает еще одну БД рядышком положить, в которую эти таблички промежуточных результатов для отчетов и перенести, отключить на эту БД лог и пусть себе там все и работает.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32197861
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот за что я и люблю FoxPro
Скачал на рабочую станцию необходимую информацию - и строй всякие временные таблицы до "посинения" - все это в локальном трафике, ты никому не мешаешь... Да и встроенный генератор отчетов весьма неплох.

P.S. Просьба воздержаться от дальнейшего обсуждения FoxPro.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198009
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2locky
Насчёт полного отключения лога - это действительно в MS SQL нельзя. Но ведь данные нужно где-то хранить? Если вы создаёте временную таблицу, она создаётся физически в ОЗУ, а логически - в логе. И ничего тут плохого нет. Или вам просто не нравится слово "лог"? Ну, забудьте о логе, считайте, что это просто массив в память... А хранится всё это там до конца транзакции (до конца стэйтмента, если не объявлена транзакция), точнее, до чекпойнта, а потом прееносится в постоянную структуру, но перено
А по поводу расширенного и улучшеного управления транзакциями, в т.ч. парралельные транзакции в одном коннекте - это было-бы здорово, но к сожалению, в MS SQL такого нет.

2Sergey Ch
Не воздержимся! Щаааас...
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198024
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2locky
Извиняюсь, не закончил фразу.
...а потом прееносится в постоянную структуру (тоже в памяти), но переносится асинхронно, и если сервер занят чем-то другим, то это процесс будет отложен.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198093
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch
Цитирую Вам автора форума:
У нас есть база, достаточно большая. По ней, естественно, надо строить отчеты. Большие и сложные. За один проход не считаются, а требуют создания большого количества промежуточных результатов.

Вы же пишите:
Скачал на рабочую станцию необходимую информацию - и строй всякие временные таблицы до "посинения" - все это в локальном трафике, ты никому не мешаешь...

Вопрос - Вы всю базу в dbf будете закачивать ? Дело даже не в FoxPro, а вот в мышлении многих программистов, работающих на файл-серверных системах. Иногда полезно все таки в тему вникнуть, а не вставлять в каждую ветку форума рекламу FoxPro. Ей богу, такая реклама приведет скоро к тому, что я действительно начну при слове FoxPro вздрагивать.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198112
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky, если использовать постоянные таблицы в качестве временных, не стоит удивляться тому, что СУБД их считает постоянными и применяет к ним механизм транзакций. Это ошибка проектирования приложения.

ASCRUS, в оракле тоже такой механизм есть (впрочем, там это, слава Аллаху, единственный механизм создания временных таблиц).

All, в Informix можно отключить поддержку транзакций на уровне базы, чреватость очевидна, но иногда это имеет смысл (например, жопой написанный софт, жопа при этом не знает, что такое транзакция и приложение ими никак не управляет).
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198125
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, действительно в MSSQL нельзя лог отключить. Даже никогда об этом не задумывался честно говоря. В ASA можно, в MSSQL нельзя, а вроде как близкие продукты.

locky
А какая у Вас Recovery Model на БД стоит ? Если не Simple, то может быть действительно БД рядышком положить с моделью лога Simple, где промежуточные результаты и хранить, чтобы лог хоть не сильно рос и основная БД без лишних поводов нагрузкам на операции записи не подвергалась ?

Scott Tiger
В ASA это тоже единственный механизм работы с временными таблицами. Но с утверждением, что использование в качестве временных постоянных таблиц - это ошибка проектирования приложения не соглашусь. В MSSQL как и в Sybase ASE (в отличие от ASA) эти глобальные временные ##таблицы больше слез вызывают, чем желание их использовать. А для сложных отчетов действительно часто нужны временные таблицы для хранения промежуточных результатов, которые должны существовать до тех пор, пока отчет себя полностью на их основе не построит.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198164
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS, ну тогда не стоит удивляться :) Кстати, я ошибся в предыдущем посте - механизм транзакций к оракловским GTT, разумеется, применяется, не применяется журналирование данных, прокачиваемых через эти таблицы.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198433
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
По поводу Sybase и временных таблиц, создающихся при коннекте - не знал,
это второй этап моих мечтаний и претензий к MS SQL.
По поводу целостности данных, которые важнее скорости - не согласен.
Это - отчет, и это - ВРЕМЕННЫЕ данные, они умрут после отчета. Но если я
бы смог заставить отчет считаться не 40 минут, а 20... это был бы праздник
Recovery Model - Simple, но когда я вставляю (или удаляю) 2*10e6 строк, не сильно
и помогает :-)
А глобальные временные таблицы MS SQL - это да... ужжжас....

2Sergey Ch
На клиента... 26 Gb... не реально :-( Да и к тому же, при изменении алгоритма
расчета отчета менять не процедуру, а код клиента...

2Alexeyvg
Нравится мне слово лог, мне не нравится, что его нельзя отключить. К тому же
в памяти временные таблицы хранятся до тех пор, пока есть память, а потом все
равно на диск...

2Scott Tiger
Механизм транзакций применяется как к постоянным, так и ко временным таблицам.
И наш подход к решению задач - не думаю, что это ошибка. Как из процедуры формирования
начальных остатков передать данные в процедуру расчета движения и формирования
конечных остатков, кроме как через таблицу?

Informix... IBM Informix Extended Parallel Server, V8.3, цитата:
Несмотря на то, что EPS не поддерживает нелогируемые базы, он поддержиавет нелогируемые
постоянные и временные таблицы.

2All
Все эти постоянно-временные таблицы у нас хранятся в Tempdb. Дело в том, что у TempDb
есть особенность - данные в ней временные, база пересоздается при рестарте сервера,
поэтому в отличие от других баз изменения в ней пишуться не СРАЗУ, а потом, по мере
необходимости (могут и вообще не писаться). Проверить достаточно просто - посмотреть
профайлер, чтения/запись.
Но этого все равно мало, крайне мало...
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198476
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как вывод - если бы MS снизошла бы до переделки механизма глобальных временных таблиц, чтобы они разделяли данные по сессиям и не участвовали в логах, то во многом настал бы рай :)

Зато я теперь кстати получил ответ на вопрос, почему же у меня при переводе с MSSQL 2000 на ASA 8 скорость сложных расчетов в ХП выросла в 3 раза. Одна из причин теперь ясна - темповые таблицы не участвуют в транзакциях. Будет свободное время, посмотреть что ли, насколько сильно ASA будет тормозить при работе с такими большими обьемами данных, как у Вас. Все таки он workgroup, прям стало интересно, как он со своей моделью работы с данными и оптимизатором потянет 26 гигов. Осталость только придумать, где бы взять такую большую БД :)
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198515
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky, Как из процедуры формирования начальных остатков передать данные в процедуру расчета движения и формирования конечных остатков, кроме как через таблицу?

Я таких слов не знаю, ты по-человечески объясни. А что, в MSSQL "настоящая" временная таблица между двумя вызовами процедур данные не сохраняет?

Informix умеет в on-line dynamic server 7.23, если мне не изменяет память.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198547
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как из процедуры формирования начальных остатков передать данные в процедуру расчета движения и формирования конечных остатков, кроме как через таблицу?
Имеется ввиду, что вызывается серия процедур, заполняющих рассчитываемые данные в некие таблицы, которые потом будут использоваться в других хранимых процедурах и отчетником (не все же данные можно вернуть для отчета одним запросом).

А что, в MSSQL "настоящая" временная таблица между двумя вызовами процедур данные не сохраняет?
Умеет. Существует правда несколько подводных камней - при ее создании одной сессией она и ее данные становяться видимыми для всех сессий, что приводит к тому, что перед их созданием неплохо бы убедиться, что они еще не существуют. Плюс возникает необходимость самостоятельно разделять данные по сессиям, по тому же @@SPID. Но что самое печальное, что если сессия, с которой такая темповая таблица была создана закрывается, то она автоматом затирается и если в ней хранятся данные других сессий, то они сильно будут "удивлены", куда это все подевалось. Как я понимаю, все это тяжелое наследие с ASE, а затем MSSQL 6.5 . Странно, что при проектировании MSSQL 7.0 весь этот тяжкий груз был перетащен вместо того, чтобы изменить модель работы СУБД с временными таблицами. Плюс вместо того, чтобы действительно исключить из участия в транзакциях темповые таблицы, в MSSQL 2000 ввели локальные переменные-таблицы, которые для увеличения скорости работы как я понял действительно не участвуют в логах, но хранятся в оперативной памяти, что ограничивает их использование с большими обьемами данных.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198658
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
Действительно, данные по сессиям у нас разделяется по @@SPID.
Для удобства, ходим не напрямую к таблицам, а к View с условием.
По поводу табличных переменных - они могут быть ооочень большими,
т.к. все равно транслируются во временные таблицы (см. sysobjects
в tempdb во время выполнения запроса, имена похожи на @___table___)

Где взять базу?
Нечто вроде биллинга, ~500000 абонентов, 3.6 года, ~310 записей на одного абонента+Справочники+остатки+так, по мелочи.
Генерится за 6-10 часов.

По поводу временных локальных и глобальных таблиц
Локальные таблицы видны и существуют в пределах сессии. Но есть определенный гемморой с их использованием (ее надо создать, если ее нет, и опять-таки очистить, если она есть)
Глобальные временные таблицы видны всем сессиям и существуют до тех пор,
пока хоть одна сессия их используетя. Гемморой тот же, что и при использовании локальных временных таблиц, плюс самому разделять данные между сессиями.
Теперь еще такая особенность.... если в пакете (процедуре, запросе)
вперемешку идут операторы DML и DDL, то это приводит к постоянным рекомпиляциям процедур. При сложных процедурах и при большой нагрузке на
сервер это очень печально....
К операторам DDL относятся такие операторы как create table....
Т.е. любые действия с временныеми таблицами практически неизбежно приводят к рекомпиляциям.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198781
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AS/400 чудно и радостно поддерживает нелогируемые таблицы.
просто без проблем.

также там можно радостно завести 5 логов для таблицы A, 2 лога для таблицы B, причем один из логов таблица A шарит с табличей B, а второй с табличей С
и т.д....
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32198894
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2locky
Всё-таки не пойму этого:
"Нравится мне слово лог, мне не нравится, что его нельзя отключить. К тому же в памяти временные таблицы хранятся до тех пор, пока есть память, а потом все равно на диск... "
Так вы хотите, что-бы временные таблицы не занимали места ни в памяти, ни на диске??? Это как?

Ещё раз.
Вы создали временную таблицу, заполнили её гигом данных. На любой СУБД нужно это место - гиг - выделить. На MSSQL это место называется логом, ну просто он так устроен, а на других СУБД может называтся по другому, как здорово пишет NewYear про AS/400 и нелогируемые таблицы на нём. Но от изменения названия суть не меняется - выделяется место, кладутся данные, при необходимости (при нехватке места) сбрасываются на диск.
Так вас всё-таки не устраивает название или вы считаете, что MSSQL сервер делает какие-то лишние операции по сравнению с какой-то другой СУБД? Тогда приведите эти конкретные операции.

2ASCRUS
Я, может, что-то упустил в обсуждении, но мне непонятно:
"Существует правда несколько подводных камней - при ее создании одной сессией она и ее данные становяться видимыми для всех сессий, что приводит к тому, что перед их созданием неплохо бы убедиться, что они еще не существуют. Плюс возникает необходимость самостоятельно разделять данные по сессиям, по тому же @@SPID"
Может, вы создаёте глобальные временные таблицы? Но если вам надо изолировать данные по сессиям, почему не использовать локальные?
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199017
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Alexeyvg
Если я правильно помню, то в MS SQL лог - это журнал изменения данных,
а не место для хранения самих данных.
я прекрасно понимаю, что для хранения 1 гига информации этот самый гиг надо выделить - я не против этого.
Я против того, что когда мне надо удалить 1000 записей из временной таблицы в случае, если получилось удалить только 900 записей, MS SQL не откатывал транзакцию назад и не восстанавливал все 1000 записей, а оставлял эти 100 неудаленных.
Аналогично при обновлении. Не удалось обновить все записи - черт с ним, отрапортуй ошибку и забудь. Мне НЕ НУЖНО восстанавливать базу в состояние до обновления.
По поводу моего "К тому же в памяти временные таблицы хранятся до тех пор, пока есть память". Временные таблички отличаются от постоянных крайне мало (только тем, что автоматом дропаются, когда уже не нужны). Они все равно хранятся в базе TempDB, база хранится на диске. Просто по возможности TempDB не сбрасывает свои страницы на диск. Грубо говоря, если у обычной базы включено только кэширование чтения и отключено кэширование записи, то для TempDB включено и кэширование чтения и кэширование записи.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199046
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удержался.

Если вы ставите в вину логу то, что ваши процедуры работают медленно, то я вам о всей ответственнойстью могу заявить, что проблемы производительности это на 90% ошибки проектирования и неоптимального кода.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199298
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже не удержался.

В MS SQL2000 есть же таблицы-переменные, изменения которых в логе не фиксируются.

2 ASCRUS
Извините если грубо, но Ваши рассуждения насчет временных таблиц в MS SQL вызывают удивление
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199333
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь действительно глобальные временные таблицы участвуют в логах и хранят не разделенные по сессиям данные. Или я не прав ? Во всяком случае при работе с MSSQL у меня так все и было. Локальные темповые таблицы в перечисленном случае тоже не подходили, нельзя в одной ХП создать локальную темповую таблицу, заполнить ее, выйти с ХП и позволить клиенту или отчетнику пользоваться ее результатами до DROP или конца сессии. Цитирую BOL:
A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process which called the stored procedure that created the table.

То есть насколько я понимаю, должен создать ее вне вызова ХП в сессии из клиентской части, что для того же Crystal Report например проблематично. Если проблема решается, просто я не знаю как, поделитесь опытом, тем более что для locky это будет полезно.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199501
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем нужна временная таблица после выполнения процедуры? Обычно для отчета в процедуре ставится в конце что-то типа select * from #tmp и по этому потоку уже и делается отчет.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199556
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если отчет использует вложенные отчеты, которые ссылаются на промежуточные данные, хранимые в этих темповых таблицах и внесенные посредством ХП, которая возвращает всего лишь центральный набор данных и подготваливает для подотчетов группу данных ? Причем как применяемое решение при использовании в сложных отчетов подотчетов временные таблицы выгодны еще тем, что не заставляют решать вопрос блокировок данных на время построения отчета. Согласитесь, чтобы реализовать отчет, содержащий в себе подотчет, который на каждую запись главного отчета получает и обрабатывает данные с реальной таблицы БД, пришлось бы в начале центральной ХП делать блокировку такой таблицы до конца сессии с целью избежания искажения отчета на начало момента его печати, и при длительном построении отчета это ни к чему хорошему не приведет. Некоторые отчеты кстати только с помощью связанных подотчетов в том же Crystal Report или PB именно так реализуются, и хочешь не хочешь, эти принципы все равно будут навязываться БД и их как то придется решать.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199576
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, на мой взгяд проблемы, которые вы описали, не требуют использовать глобальные ВТ.
С Crystal Report не знаком.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199612
ggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky:
В Sybase есть один такой момент для увеличения скорости работы:
если вы пишете
create table #tmp_table ......
insert ... into #tmp_table - то эти операции отражаются в Transaction log.
если же вы создаете и заполняете временную таблицу через:
select .....
into #tmp_table
то операции создания и записи данных в #tmp_table не заносятся в лог и работают заметно быстрее. Попробуйте, может MSSQL делает так-же.
И если что-то выйдет, то скажете - помогло или нет?
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32199665
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О временных таблицах.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create procedure spOuter
as
create table #temp(id int)

insert into #temp
select  1 
union all
select  5 

exec spInner

go

create procedure spInner
as

select * from #temp

go

exec spOuter
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32200032
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
Я не ставлю в вину логу то, что процедуры работают медленно - это было бы просто глупо. Я недоволен тем, что в моем случае обеспечивается абсолютно ненужная мне функциональность - обеспечение журналирования моих действий. Просто в процессе оптимизации оказалось, что для увеличения скорости необходимо или - ну, почти как минимум чудо или гений, или, хорошо бы, отключить все ненужные операции.
Мне не нужно производить откаты. Меня вполне бы устроили... как бы так сказать... мини-транзакции на уровне страницы.
Предположим, в табличке 10 страниц, я начал удаление. Удалили 1-2-3 записи (1 страницу), записал это в лог, затем 2-я страница, 3-я.. если на 4-й произошла ошибка, будут откачены изменения и 4-й, и 1-2-3. Меня устроило бы, чтобы откатывалось изменение только 4-й страницы - исключительно ради физической целостности.
В принципе, так и приходится... вместо того чтобы сразу удалить данные из таблицы, удалять их порциями по 15000-20000 штук- становится легче, но не до конца.
2SergSuper
Таблицы-переменные - они переменные, и видны исключительно внутри процедуры. К тому же, если я не ошибаюсь, они не участвуют в явных транзакциях, но при обновлении такой таблицы она опять-таки, или вся обновится или не вся - атомарно, так сказать.
2Ggg
select ... into #temptable...
насколько я помню, на время выполнения такой операции накладывается SchemaStabilityLock на TempDB, что есть не очень, даже совсем нехорошо.
Кроме того, это только вставка... А прочие операции? Это даже если забыть про перекомпиляции и прочие прелести....

В общем, грустно как-то, господа....
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32200066
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто в процессе оптимизации оказалось, что для увеличения скорости необходимо или - ну, почти как минимум чудо или гений, или, хорошо бы, отключить все ненужные операции.
...
В принципе, так и приходится... вместо того чтобы сразу удалить данные из таблицы, удалять их порциями по 15000-20000 штук- становится легче, но не до конца.


По мне так странно при таком подходе слышать заявления о том, что вы оптимизировали свой код настолько, что уперлись в ограничения движка SQL сервера. Не верю я, что 1000000 записей во временной таблице свидетельствует о полностью оптимизированных для задачи схеме данных и коде.
И потом оптимизировать производительность можно и на аппаратном уровне. Например, поместить лог и tempdb на отдельные RAID 10.

Кроме того вы немного играете понятиями. На самом деле вам не хочется ждать отката транзакции при ОШИБКЕ, те в случае нарушения процесса ваших рассчетов. Те если ошибки нет, то лог вам как бы и не мешает ?
Но ОШИБКА есть что-то исключительное. Она не может появляться при каждом втором запуске. Иначе, как в том анекдоте, "что-то не так в консерватории"
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32200080
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вот, тоже, не хотел встревать. А когда собрался, то опять, как всегда, Glory опередил. Это что же за база и железо такие, где откат транзакции является рутинной операцией? И при чем тут накладные расходы? Нет денег на сказевые дисководы? Ну так и пишите, что на Вашем барахле есть проблемы.
Ежели кто не в курсах, то если база на SCSI 1, а лог на SCSI 2, то ЗАПИСЬ ИДЕТ ПАРАЛЛЕЛЬНО.

На мой взгляд, глобальные временные таблы - это уступка любителям DBF. Что бы они писались сухо и комфортно.

Я не думаю, что у разработчиков MS SQL есть проблемы сделать
SET SAVE_IN_LOG {ON|OFF}

Но я думаю, что если они это сделают, то кривые руки locky смогут серьезно подорвать репутацию MS SQL.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32201365
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
ну... 1000000, это я конечно слегка приврал, наверное. На самом деле около 490000.
По поводу оптимизации на аппаратном уровне... Знаю я прекрасно, что 10 RAID на 4х дисках на 40-50% быстрее 5-го на 3-х при том же объеме доступного пространства. Знаю, что и стоят диски не слишком то и дорого.
Но мне нужно работать на том, что есть. В смысле покупки железа я заказчикам не слишком и указ.
По поводу такого количества строк во временных данных... ну, к примеру, расчет сальдо всеж-таки проще было бы делать за один проход по всему диапазону счетов, а не разбивая счета на поддиапазоны.
Если ошибки нет, то лог и не мешает? Мешает. При изменении 8000-й странички сервер помнит, что он поменял еще 7999 страничек? Помнит. И под это дело выделил место в логе, правильно? Затем. Это ведь транзакция? Транзакция. Значит, должны быть блокировки. В определенный момент сервер решает, что дешевле блокировать не построчно, и даже не экстентами, а наложить лок на таблицу. В результате все ждут. Понятное дело, все это благополучно разрешается разведением по разным табличкам.
2Cat2
Откаты транзакций в базе достаточно редки. Специально статистику не вел, если честно, но предполагаю что порядка 10-15 раз в день, причем откат на уровне максимум 60 строк.
При расчете отчетов откатов нет вообще. Там просто негде возникнуть ошибкам (ну правда, негде!). Но возможность для отката, причем принудительно, мне предоставляют.
Вообще говоря, все описанные проблемы я благополучно решаю, все работает в пределах допустимого времени ожидания и все такое. Просто немного неприятно, что мне приходится иногда сильно изворачиваться, чтобы приемлимо решить ту или иную задачу.
А еще, блин, достало то, что даже после 3-го сервиспака, QA в плане запросе какую-то ересь пишет.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32201379
Denis A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему хватит думать за сервер, как ему лучше работать. Надо использовать то, что он (сервер) предлагает. Например "truncate log at checkpoint".
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32201394
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Denis A
К сожалению, в некоторых случаях я думаю лучше, чем сервер. Ну, по крайней мере, при некоторых ключевых выборках те планы запросов, которые я ему навязываю, оказываются лучше, чем те, которые он выбирает сам.
А Truncate Log on Checkpoint - это все ж таки не то (см. BOL).

2All
Кстати, может быть я зря напрягаюсь. Просто не с чем сравнить производительность (сколько искал - ни один из производителей подобных систем не приводит скоростных характеристик), так что может быть все и так хорошо.
Устал в последнее время немного, вот и озлобился :-)
Хотя, у MS SQL действительно есть некорые не совсем объяснимые с моей точки зрения моменты.
Попробуйте это скрипт
У меня при первой вставке ошибка 8624, Internal SQL Server error.
А при 2-й все нормально

create table temp(SPID smallint default @@SPID,Summ int)
go

create view TEmp_v as select SUmm from temp where SPID = @@SPID
go

insert into TEmp_v(Summ)
select Sum(uid) from sysobjects
go

insert into TEmp_v(Summ)
select Summ from (select Summ=Sum(uid) from sysobjects)S
go
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32203069
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2locky

Другими словами вы

- сделали одну постоянную таблицу для всех коннектов
- в каждом коннекте записывете туда до 490000 записей
- расположили tempdb и лог на небыстром для записи RAID-5

и после этого продолжаете утверждать, что все ваши проблемы только в том, что SQL сервер ведет transaction log ??? У меня просто нет слов
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32203462
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще то лог по другой причине отключают...
дело в том, что базу нужно обслуживать. все эти транзакции... логи. т.е. нужен человек, который за всем этом следить будет. если снести лог, то сразу будет счастье. и никакой дба не нужен.

вот например J. D. Edvards for AS/400. там куча таблиц, и не одного журнала нет. такая система стоит в Panasonic (CIS). и все счастливы без журналов. нахрен еще за базой следить, когда лучше бы этот человек чем-то полезным занялся? пусть набивает какой-нибудь invoice, хрен правда знает, что это , но слово такое есть. а dba - нахрен он? он же денег не приносит...
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32203693
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
>и после этого продолжаете утверждать, что все ваши проблемы только в том,
>что SQL сервер ведет transaction log ???

Я этого как-раз не утверждал, да и не буду. Просто если бы можно было бы отключить лог, мне в 6 из 80 отчетов было бы полегче.
По поводу железа...
Заказчику было предложено 2 конфигурации железа: рекомендуемая и минимально необходимая. Угадайте с 3-х раз, что он выбрал.

Вообще-то у меня вопрос был чисто риторический - я прекрасно знаю, что нельзя отключить лог в MS SQL, и, вообще говоря, для сервера БД это неправильно. Знаю, что существуют возможности порешать все проблемы. К примеру переписать отчеты по другому. Именно это и приходится делать. Но при написании отчета таким образом, чтобы обойти некторые проблемы, можно потерять прозрачное понимание методики расчета отчета. Да и в случае изменения алгоритма расчета есть большая вероятность, что его нужно будет переоптимизировать.
P.S.
И опять таки повторюсь: если есть какая-то функциональность - спасибо тебе, разработчик, подумал ты обо мне. Но дай мне возможность ее включать и выключать.
Тот же Informix, например, прекрасно понимает, зачем нужны нелоггируемые таблицы, а MS - нет. Обидно.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32204933
IBMer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В DB2 можно отключать и включать лог для таблицы. Хотя это на мой взгляд может быть хорошо в ограниченном кол-ве случаев.

Вообще-то может вам над хранилищем данных подумать???
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32205000
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2IBMer
По поводу хранилища данных - хорошо бы, но...
есть всего несколько отчетов из многих, которым бы это пригодилось, и ради них требовать еще один сервер и т.д. - и мороки много, и все равно не дадут.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32206375
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to locky
Переходи на Oracle :-), там можно отключить.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32226128
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот например Informix позволяет использовать базу хоть с журналированием (два вида журналирования + ANSI совместимое) или без журналирования, и даже нежурналируемые таблицы в журналируемой базе. Так что Informix рулит.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32256700
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, нужно переделывать свои представления под окружающую действительность, а не сетовать, что окружающая действительность не соответствует собственным представлениям. Проблема, собственно, в чем? При запуске отчета вы формируете таблицу с огромным количеством записей. Таблица временная, и при следующем запуске отчета она будет формироваться с нуля. Это работает медленно. Так?
А что нельзя сделать так, чтобы таблица, которую ты формируешь, была не временной, а постоянной? Тогда отпадает огромное количество проблем. В частности, не нужно проверять, создал ее кто-то секунду назад и не исчезла ли она через миллисекунду после проверки ее существования. Содержимое таблицы может формироваться триггерами в процессе пополнения и модификации основных таблиц. Отчеты строятся по таблице ТОЛЬКО операциями SELECT. Модификации затрагивают единичные записи и не требуют блокировки всей таблицы. Результат: работа отчетов ускоряется в несколько раз, добавление новых проводок замедляется на ничтожно малую величину.
...
Рейтинг: 0 / 0
О вреде транзакций, или "Как же отключить transaction log?"
    #32257512
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Таблица "Псевдо-временная", spid-разделенная. В принципе, я уже это описывал. как описывал и то, почему у меня возникли определенные проблемы, и то, как я их решаю, причем более менеее успешно.
по поводу, почему бы не формировать таблицу триггерами и т.д....
Исходная таблица ~24 Gb, 98*10^6 строк, еженедельный(5.5 дня) прирост около 6*10^6 строк... мелкие выборки (вроде карточки абонента, долгов по ограниченному набору лицевых счетов и т.д.) считаются вполне приемлимое время (0.6 - 2.0 сек). а вот отчеты, требующие, к примеру, показа структуры задолженности по диапазонам долга в разбиении по районам, считаются достаточно долго.
Таблица оплат относительно небольшая, 12*10^6 строк. Плюс остатки на начало месяца (5*10^5 строк каждый месяц). Одним select'ом получить сальдо на указанную дату получается еще накладнее, чем посчитать отдельно сальдо входящее, начисления, оплату и затем высчитать сальдо исходящее.
вот и приходится прогонять через псевдо-временную таблицу все лицевые и считать для них сальдо и движение. Одновременно в таблице не бывает более 5-7 тысяч записей (все считается группами по 5 тысяч ЛС, число подобрано экспериментально). Просто логгирование транзитных и по смыслу временных данных мне представляется по крайней мере неразумным.

P.S.
Для тех отчетов, для которых это возможно, раз в сутки ночью считается суммарная информация. А для нескольких объем суммарной информации сопоставим с объемом исходной информации. Вот с этими то отчетами я и мучаюсь.
P.P.S.
В виду того, что пока вроде бы товарищ Б.Гейтс не собирается реализовывать то, что мне хотелось бы, а так же в виду полной риторичности моего вопроса, предлагаю тему закрыть.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / О вреде транзакций, или "Как же отключить transaction log?"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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