Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
В конференции по MS SQL был вопрос, как же все таки отключить transaction log. Правда, вопрошающего сразу запинали, сказали, что он в корне не прав, и лог - это правильно. Вопрощающий сказал - Ладно, пусть не всегда, а иногда отключать, я ДБА, я лучше знаю, нужен он или нет. Ему сказали - гнать таких ДБА, лог - это свято, без него нельзя. Наверное, меня тоже гнать надо, но мне лог мешает. вот к примеру... У нас есть база, достаточно большая. По ней, естественно, надо строить отчеты. Большие и сложные. За один проход не считаются, а требуют создания большого количества промежуточных результатов. Обычно в таких случаях создают временную табличку, промежуточные результаты складывать. И всем по большому счету плевать, если при работе с этой временной табличкой произойдет ошибка (не вставилось все или не все удалилось) - просто ловят ошибку и выходят из процедуры. Она ведь временная, и так дропнется по выходу из области видимости - кому она нужна?! А у нас в качестве временных табличек используются постоянные (удобнее нам так). И мне все равно, если при удалении из этой таблички произойдет ошибка и удалятся не все данные - я ловлю ошибку и просто выхожу из процедуры. Тоже самое при вставке. Ну не волнует меня непротиворечивость данных в этих табличках - они по смыслу временные. Но! Я вынужден тратить дисковое пространство под лог(а места на диске не так уж и много), я вынужден терпеть накладные расходы на обслуживание лога (а сервер - не бесконечной мощности), я вынужден терпеть взаимоблакировки пользователей (а вдруг кто-то поменяет данные! ой!) и т.д. Поэтому так и тянуться руки отключить лог - а НЕКАК!!!! А хочется.... И вообще, что это за механизм транзакций такой? Почему переход на следующий уровень вложенности вверх или вниз так различается? Почему я должен об этом помнить? "так, здесь - begin tran, тут - save tran..."? Почему нельзя открыть две паралельные транзакции в одном коннекте? В одной (маленькой и быстрой) получать номер документа, во второй (большой и медленной) создавать спецификацию документа? Почему кто-то должен ждать момента, пока другой не отпустит давно ненужный ему ресурс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2003, 20:33 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Сорри - немножно не в тему, но вспомнилось вот, как меня глобальные темповые таблицы в Sybase ASA прикололи: создается глобальная темповая таблица, причем описание ее структуры хранится в БД. Любой коннект, который подцепляется к БД ее сразу видит, даже из Enterprice Manager, причем как полноценную таблицу, правда на ней значек специальный, указывающий, что она временная. Пока ее не дропнешь, она так в БД и остается существовать. Для каждого коннекта в ней будут хранятся свои данные. Ей можно указать как она будет обнуляться - при commit или при завершении соединения. Хоть структура и хранится в БД, но данные такая табличка хранит в темповой БД и в транзакциях не участвует, поэтому скорость работы с ней приятная, блокировки естественно отсутствуют, раз она получается разделена между пользователеми. Очень мне даже эти таблички помогли как раз в первую очередь для отчетов. Ну а по существу - нельзя наверное все таки в БД лог отключать, целостность данных гораздо важнее скорости. В принципе если так подумать, кто Вам мешает еще одну БД рядышком положить, в которую эти таблички промежуточных результатов для отчетов и перенести, отключить на эту БД лог и пусть себе там все и работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 00:23 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Вот за что я и люблю FoxPro Скачал на рабочую станцию необходимую информацию - и строй всякие временные таблицы до "посинения" - все это в локальном трафике, ты никому не мешаешь... Да и встроенный генератор отчетов весьма неплох. P.S. Просьба воздержаться от дальнейшего обсуждения FoxPro. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 01:22 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2locky Насчёт полного отключения лога - это действительно в MS SQL нельзя. Но ведь данные нужно где-то хранить? Если вы создаёте временную таблицу, она создаётся физически в ОЗУ, а логически - в логе. И ничего тут плохого нет. Или вам просто не нравится слово "лог"? Ну, забудьте о логе, считайте, что это просто массив в память... А хранится всё это там до конца транзакции (до конца стэйтмента, если не объявлена транзакция), точнее, до чекпойнта, а потом прееносится в постоянную структуру, но перено А по поводу расширенного и улучшеного управления транзакциями, в т.ч. парралельные транзакции в одном коннекте - это было-бы здорово, но к сожалению, в MS SQL такого нет. 2Sergey Ch Не воздержимся! Щаааас... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 09:54 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2locky Извиняюсь, не закончил фразу. ...а потом прееносится в постоянную структуру (тоже в памяти), но переносится асинхронно, и если сервер занят чем-то другим, то это процесс будет отложен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 10:03 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Sergey Ch Цитирую Вам автора форума: У нас есть база, достаточно большая. По ней, естественно, надо строить отчеты. Большие и сложные. За один проход не считаются, а требуют создания большого количества промежуточных результатов. Вы же пишите: Скачал на рабочую станцию необходимую информацию - и строй всякие временные таблицы до "посинения" - все это в локальном трафике, ты никому не мешаешь... Вопрос - Вы всю базу в dbf будете закачивать ? Дело даже не в FoxPro, а вот в мышлении многих программистов, работающих на файл-серверных системах. Иногда полезно все таки в тему вникнуть, а не вставлять в каждую ветку форума рекламу FoxPro. Ей богу, такая реклама приведет скоро к тому, что я действительно начну при слове FoxPro вздрагивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 10:50 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
locky, если использовать постоянные таблицы в качестве временных, не стоит удивляться тому, что СУБД их считает постоянными и применяет к ним механизм транзакций. Это ошибка проектирования приложения. ASCRUS, в оракле тоже такой механизм есть (впрочем, там это, слава Аллаху, единственный механизм создания временных таблиц). All, в Informix можно отключить поддержку транзакций на уровне базы, чреватость очевидна, но иногда это имеет смысл (например, жопой написанный софт, жопа при этом не знает, что такое транзакция и приложение ими никак не управляет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 10:59 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Странно, действительно в MSSQL нельзя лог отключить. Даже никогда об этом не задумывался честно говоря. В ASA можно, в MSSQL нельзя, а вроде как близкие продукты. locky А какая у Вас Recovery Model на БД стоит ? Если не Simple, то может быть действительно БД рядышком положить с моделью лога Simple, где промежуточные результаты и хранить, чтобы лог хоть не сильно рос и основная БД без лишних поводов нагрузкам на операции записи не подвергалась ? Scott Tiger В ASA это тоже единственный механизм работы с временными таблицами. Но с утверждением, что использование в качестве временных постоянных таблиц - это ошибка проектирования приложения не соглашусь. В MSSQL как и в Sybase ASE (в отличие от ASA) эти глобальные временные ##таблицы больше слез вызывают, чем желание их использовать. А для сложных отчетов действительно часто нужны временные таблицы для хранения промежуточных результатов, которые должны существовать до тех пор, пока отчет себя полностью на их основе не построит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 11:07 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
ASCRUS, ну тогда не стоит удивляться :) Кстати, я ошибся в предыдущем посте - механизм транзакций к оракловским GTT, разумеется, применяется, не применяется журналирование данных, прокачиваемых через эти таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 11:24 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
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 есть особенность - данные в ней временные, база пересоздается при рестарте сервера, поэтому в отличие от других баз изменения в ней пишуться не СРАЗУ, а потом, по мере необходимости (могут и вообще не писаться). Проверить достаточно просто - посмотреть профайлер, чтения/запись. Но этого все равно мало, крайне мало... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 13:50 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Ну как вывод - если бы MS снизошла бы до переделки механизма глобальных временных таблиц, чтобы они разделяли данные по сессиям и не участвовали в логах, то во многом настал бы рай :) Зато я теперь кстати получил ответ на вопрос, почему же у меня при переводе с MSSQL 2000 на ASA 8 скорость сложных расчетов в ХП выросла в 3 раза. Одна из причин теперь ясна - темповые таблицы не участвуют в транзакциях. Будет свободное время, посмотреть что ли, насколько сильно ASA будет тормозить при работе с такими большими обьемами данных, как у Вас. Все таки он workgroup, прям стало интересно, как он со своей моделью работы с данными и оптимизатором потянет 26 гигов. Осталость только придумать, где бы взять такую большую БД :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 14:11 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
locky, Как из процедуры формирования начальных остатков передать данные в процедуру расчета движения и формирования конечных остатков, кроме как через таблицу? Я таких слов не знаю, ты по-человечески объясни. А что, в MSSQL "настоящая" временная таблица между двумя вызовами процедур данные не сохраняет? Informix умеет в on-line dynamic server 7.23, если мне не изменяет память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 14:31 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Как из процедуры формирования начальных остатков передать данные в процедуру расчета движения и формирования конечных остатков, кроме как через таблицу? Имеется ввиду, что вызывается серия процедур, заполняющих рассчитываемые данные в некие таблицы, которые потом будут использоваться в других хранимых процедурах и отчетником (не все же данные можно вернуть для отчета одним запросом). А что, в MSSQL "настоящая" временная таблица между двумя вызовами процедур данные не сохраняет? Умеет. Существует правда несколько подводных камней - при ее создании одной сессией она и ее данные становяться видимыми для всех сессий, что приводит к тому, что перед их созданием неплохо бы убедиться, что они еще не существуют. Плюс возникает необходимость самостоятельно разделять данные по сессиям, по тому же @@SPID. Но что самое печальное, что если сессия, с которой такая темповая таблица была создана закрывается, то она автоматом затирается и если в ней хранятся данные других сессий, то они сильно будут "удивлены", куда это все подевалось. Как я понимаю, все это тяжелое наследие с ASE, а затем MSSQL 6.5 . Странно, что при проектировании MSSQL 7.0 весь этот тяжкий груз был перетащен вместо того, чтобы изменить модель работы СУБД с временными таблицами. Плюс вместо того, чтобы действительно исключить из участия в транзакциях темповые таблицы, в MSSQL 2000 ввели локальные переменные-таблицы, которые для увеличения скорости работы как я понял действительно не участвуют в логах, но хранятся в оперативной памяти, что ограничивает их использование с большими обьемами данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 15:02 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2ASCRUS Действительно, данные по сессиям у нас разделяется по @@SPID. Для удобства, ходим не напрямую к таблицам, а к View с условием. По поводу табличных переменных - они могут быть ооочень большими, т.к. все равно транслируются во временные таблицы (см. sysobjects в tempdb во время выполнения запроса, имена похожи на @___table___) Где взять базу? Нечто вроде биллинга, ~500000 абонентов, 3.6 года, ~310 записей на одного абонента+Справочники+остатки+так, по мелочи. Генерится за 6-10 часов. По поводу временных локальных и глобальных таблиц Локальные таблицы видны и существуют в пределах сессии. Но есть определенный гемморой с их использованием (ее надо создать, если ее нет, и опять-таки очистить, если она есть) Глобальные временные таблицы видны всем сессиям и существуют до тех пор, пока хоть одна сессия их используетя. Гемморой тот же, что и при использовании локальных временных таблиц, плюс самому разделять данные между сессиями. Теперь еще такая особенность.... если в пакете (процедуре, запросе) вперемешку идут операторы DML и DDL, то это приводит к постоянным рекомпиляциям процедур. При сложных процедурах и при большой нагрузке на сервер это очень печально.... К операторам DDL относятся такие операторы как create table.... Т.е. любые действия с временныеми таблицами практически неизбежно приводят к рекомпиляциям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 15:50 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
AS/400 чудно и радостно поддерживает нелогируемые таблицы. просто без проблем. также там можно радостно завести 5 логов для таблицы A, 2 лога для таблицы B, причем один из логов таблица A шарит с табличей B, а второй с табличей С и т.д.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 16:48 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2locky Всё-таки не пойму этого: "Нравится мне слово лог, мне не нравится, что его нельзя отключить. К тому же в памяти временные таблицы хранятся до тех пор, пока есть память, а потом все равно на диск... " Так вы хотите, что-бы временные таблицы не занимали места ни в памяти, ни на диске??? Это как? Ещё раз. Вы создали временную таблицу, заполнили её гигом данных. На любой СУБД нужно это место - гиг - выделить. На MSSQL это место называется логом, ну просто он так устроен, а на других СУБД может называтся по другому, как здорово пишет NewYear про AS/400 и нелогируемые таблицы на нём. Но от изменения названия суть не меняется - выделяется место, кладутся данные, при необходимости (при нехватке места) сбрасываются на диск. Так вас всё-таки не устраивает название или вы считаете, что MSSQL сервер делает какие-то лишние операции по сравнению с какой-то другой СУБД? Тогда приведите эти конкретные операции. 2ASCRUS Я, может, что-то упустил в обсуждении, но мне непонятно: "Существует правда несколько подводных камней - при ее создании одной сессией она и ее данные становяться видимыми для всех сессий, что приводит к тому, что перед их созданием неплохо бы убедиться, что они еще не существуют. Плюс возникает необходимость самостоятельно разделять данные по сессиям, по тому же @@SPID" Может, вы создаёте глобальные временные таблицы? Но если вам надо изолировать данные по сессиям, почему не использовать локальные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 17:42 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2Alexeyvg Если я правильно помню, то в MS SQL лог - это журнал изменения данных, а не место для хранения самих данных. я прекрасно понимаю, что для хранения 1 гига информации этот самый гиг надо выделить - я не против этого. Я против того, что когда мне надо удалить 1000 записей из временной таблицы в случае, если получилось удалить только 900 записей, MS SQL не откатывал транзакцию назад и не восстанавливал все 1000 записей, а оставлял эти 100 неудаленных. Аналогично при обновлении. Не удалось обновить все записи - черт с ним, отрапортуй ошибку и забудь. Мне НЕ НУЖНО восстанавливать базу в состояние до обновления. По поводу моего "К тому же в памяти временные таблицы хранятся до тех пор, пока есть память". Временные таблички отличаются от постоянных крайне мало (только тем, что автоматом дропаются, когда уже не нужны). Они все равно хранятся в базе TempDB, база хранится на диске. Просто по возможности TempDB не сбрасывает свои страницы на диск. Грубо говоря, если у обычной базы включено только кэширование чтения и отключено кэширование записи, то для TempDB включено и кэширование чтения и кэширование записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 19:38 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Не удержался. Если вы ставите в вину логу то, что ваши процедуры работают медленно, то я вам о всей ответственнойстью могу заявить, что проблемы производительности это на 90% ошибки проектирования и неоптимального кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2003, 20:28 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Тоже не удержался. В MS SQL2000 есть же таблицы-переменные, изменения которых в логе не фиксируются. 2 ASCRUS Извините если грубо, но Ваши рассуждения насчет временных таблиц в MS SQL вызывают удивление ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 10:22 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Но ведь действительно глобальные временные таблицы участвуют в логах и хранят не разделенные по сессиям данные. Или я не прав ? Во всяком случае при работе с 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 это будет полезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 10:53 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
А зачем нужна временная таблица после выполнения процедуры? Обычно для отчета в процедуре ставится в конце что-то типа select * from #tmp и по этому потоку уже и делается отчет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 12:13 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
А если отчет использует вложенные отчеты, которые ссылаются на промежуточные данные, хранимые в этих темповых таблицах и внесенные посредством ХП, которая возвращает всего лишь центральный набор данных и подготваливает для подотчетов группу данных ? Причем как применяемое решение при использовании в сложных отчетов подотчетов временные таблицы выгодны еще тем, что не заставляют решать вопрос блокировок данных на время построения отчета. Согласитесь, чтобы реализовать отчет, содержащий в себе подотчет, который на каждую запись главного отчета получает и обрабатывает данные с реальной таблицы БД, пришлось бы в начале центральной ХП делать блокировку такой таблицы до конца сессии с целью избежания искажения отчета на начало момента его печати, и при длительном построении отчета это ни к чему хорошему не приведет. Некоторые отчеты кстати только с помощью связанных подотчетов в том же Crystal Report или PB именно так реализуются, и хочешь не хочешь, эти принципы все равно будут навязываться БД и их как то придется решать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 12:46 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Не знаю, на мой взгяд проблемы, которые вы описали, не требуют использовать глобальные ВТ. С Crystal Report не знаком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 13:02 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2 locky: В Sybase есть один такой момент для увеличения скорости работы: если вы пишете create table #tmp_table ...... insert ... into #tmp_table - то эти операции отражаются в Transaction log. если же вы создаете и заполняете временную таблицу через: select ..... into #tmp_table то операции создания и записи данных в #tmp_table не заносятся в лог и работают заметно быстрее. Попробуйте, может MSSQL делает так-же. И если что-то выйдет, то скажете - помогло или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 13:24 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
О временных таблицах. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 13:43 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2Glory Я не ставлю в вину логу то, что процедуры работают медленно - это было бы просто глупо. Я недоволен тем, что в моем случае обеспечивается абсолютно ненужная мне функциональность - обеспечение журналирования моих действий. Просто в процессе оптимизации оказалось, что для увеличения скорости необходимо или - ну, почти как минимум чудо или гений, или, хорошо бы, отключить все ненужные операции. Мне не нужно производить откаты. Меня вполне бы устроили... как бы так сказать... мини-транзакции на уровне страницы. Предположим, в табличке 10 страниц, я начал удаление. Удалили 1-2-3 записи (1 страницу), записал это в лог, затем 2-я страница, 3-я.. если на 4-й произошла ошибка, будут откачены изменения и 4-й, и 1-2-3. Меня устроило бы, чтобы откатывалось изменение только 4-й страницы - исключительно ради физической целостности. В принципе, так и приходится... вместо того чтобы сразу удалить данные из таблицы, удалять их порциями по 15000-20000 штук- становится легче, но не до конца. 2SergSuper Таблицы-переменные - они переменные, и видны исключительно внутри процедуры. К тому же, если я не ошибаюсь, они не участвуют в явных транзакциях, но при обновлении такой таблицы она опять-таки, или вся обновится или не вся - атомарно, так сказать. 2Ggg select ... into #temptable... насколько я помню, на время выполнения такой операции накладывается SchemaStabilityLock на TempDB, что есть не очень, даже совсем нехорошо. Кроме того, это только вставка... А прочие операции? Это даже если забыть про перекомпиляции и прочие прелести.... В общем, грустно как-то, господа.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 19:22 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Просто в процессе оптимизации оказалось, что для увеличения скорости необходимо или - ну, почти как минимум чудо или гений, или, хорошо бы, отключить все ненужные операции. ... В принципе, так и приходится... вместо того чтобы сразу удалить данные из таблицы, удалять их порциями по 15000-20000 штук- становится легче, но не до конца. По мне так странно при таком подходе слышать заявления о том, что вы оптимизировали свой код настолько, что уперлись в ограничения движка SQL сервера. Не верю я, что 1000000 записей во временной таблице свидетельствует о полностью оптимизированных для задачи схеме данных и коде. И потом оптимизировать производительность можно и на аппаратном уровне. Например, поместить лог и tempdb на отдельные RAID 10. Кроме того вы немного играете понятиями. На самом деле вам не хочется ждать отката транзакции при ОШИБКЕ, те в случае нарушения процесса ваших рассчетов. Те если ошибки нет, то лог вам как бы и не мешает ? Но ОШИБКА есть что-то исключительное. Она не может появляться при каждом втором запуске. Иначе, как в том анекдоте, "что-то не так в консерватории" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 20:48 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Вот, тоже, не хотел встревать. А когда собрался, то опять, как всегда, Glory опередил. Это что же за база и железо такие, где откат транзакции является рутинной операцией? И при чем тут накладные расходы? Нет денег на сказевые дисководы? Ну так и пишите, что на Вашем барахле есть проблемы. Ежели кто не в курсах, то если база на SCSI 1, а лог на SCSI 2, то ЗАПИСЬ ИДЕТ ПАРАЛЛЕЛЬНО. На мой взгляд, глобальные временные таблы - это уступка любителям DBF. Что бы они писались сухо и комфортно. Я не думаю, что у разработчиков MS SQL есть проблемы сделать SET SAVE_IN_LOG {ON|OFF} Но я думаю, что если они это сделают, то кривые руки locky смогут серьезно подорвать репутацию MS SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2003, 21:58 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2Glory ну... 1000000, это я конечно слегка приврал, наверное. На самом деле около 490000. По поводу оптимизации на аппаратном уровне... Знаю я прекрасно, что 10 RAID на 4х дисках на 40-50% быстрее 5-го на 3-х при том же объеме доступного пространства. Знаю, что и стоят диски не слишком то и дорого. Но мне нужно работать на том, что есть. В смысле покупки железа я заказчикам не слишком и указ. По поводу такого количества строк во временных данных... ну, к примеру, расчет сальдо всеж-таки проще было бы делать за один проход по всему диапазону счетов, а не разбивая счета на поддиапазоны. Если ошибки нет, то лог и не мешает? Мешает. При изменении 8000-й странички сервер помнит, что он поменял еще 7999 страничек? Помнит. И под это дело выделил место в логе, правильно? Затем. Это ведь транзакция? Транзакция. Значит, должны быть блокировки. В определенный момент сервер решает, что дешевле блокировать не построчно, и даже не экстентами, а наложить лок на таблицу. В результате все ждут. Понятное дело, все это благополучно разрешается разведением по разным табличкам. 2Cat2 Откаты транзакций в базе достаточно редки. Специально статистику не вел, если честно, но предполагаю что порядка 10-15 раз в день, причем откат на уровне максимум 60 строк. При расчете отчетов откатов нет вообще. Там просто негде возникнуть ошибкам (ну правда, негде!). Но возможность для отката, причем принудительно, мне предоставляют. Вообще говоря, все описанные проблемы я благополучно решаю, все работает в пределах допустимого времени ожидания и все такое. Просто немного неприятно, что мне приходится иногда сильно изворачиваться, чтобы приемлимо решить ту или иную задачу. А еще, блин, достало то, что даже после 3-го сервиспака, QA в плане запросе какую-то ересь пишет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2003, 20:56 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
По моему хватит думать за сервер, как ему лучше работать. Надо использовать то, что он (сервер) предлагает. Например "truncate log at checkpoint". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2003, 21:23 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2003, 22:31 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2locky Другими словами вы - сделали одну постоянную таблицу для всех коннектов - в каждом коннекте записывете туда до 490000 записей - расположили tempdb и лог на небыстром для записи RAID-5 и после этого продолжаете утверждать, что все ваши проблемы только в том, что SQL сервер ведет transaction log ??? У меня просто нет слов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:49 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
вообще то лог по другой причине отключают... дело в том, что базу нужно обслуживать. все эти транзакции... логи. т.е. нужен человек, который за всем этом следить будет. если снести лог, то сразу будет счастье. и никакой дба не нужен. вот например J. D. Edvards for AS/400. там куча таблиц, и не одного журнала нет. такая система стоит в Panasonic (CIS). и все счастливы без журналов. нахрен еще за базой следить, когда лучше бы этот человек чем-то полезным занялся? пусть набивает какой-нибудь invoice, хрен правда знает, что это , но слово такое есть. а dba - нахрен он? он же денег не приносит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 16:26 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2Glory >и после этого продолжаете утверждать, что все ваши проблемы только в том, >что SQL сервер ведет transaction log ??? Я этого как-раз не утверждал, да и не буду. Просто если бы можно было бы отключить лог, мне в 6 из 80 отчетов было бы полегче. По поводу железа... Заказчику было предложено 2 конфигурации железа: рекомендуемая и минимально необходимая. Угадайте с 3-х раз, что он выбрал. Вообще-то у меня вопрос был чисто риторический - я прекрасно знаю, что нельзя отключить лог в MS SQL, и, вообще говоря, для сервера БД это неправильно. Знаю, что существуют возможности порешать все проблемы. К примеру переписать отчеты по другому. Именно это и приходится делать. Но при написании отчета таким образом, чтобы обойти некторые проблемы, можно потерять прозрачное понимание методики расчета отчета. Да и в случае изменения алгоритма расчета есть большая вероятность, что его нужно будет переоптимизировать. P.S. И опять таки повторюсь: если есть какая-то функциональность - спасибо тебе, разработчик, подумал ты обо мне. Но дай мне возможность ее включать и выключать. Тот же Informix, например, прекрасно понимает, зачем нужны нелоггируемые таблицы, а MS - нет. Обидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 19:16 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
В DB2 можно отключать и включать лог для таблицы. Хотя это на мой взгляд может быть хорошо в ограниченном кол-ве случаев. Вообще-то может вам над хранилищем данных подумать??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2003, 18:38 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
2IBMer По поводу хранилища данных - хорошо бы, но... есть всего несколько отчетов из многих, которым бы это пригодилось, и ради них требовать еще один сервер и т.д. - и мороки много, и все равно не дадут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2003, 20:20 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
to locky Переходи на Oracle :-), там можно отключить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2003, 17:11 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
Вот например Informix позволяет использовать базу хоть с журналированием (два вида журналирования + ANSI совместимое) или без журналирования, и даже нежурналируемые таблицы в журналируемой базе. Так что Informix рулит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2003, 11:09 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
ИМХО, нужно переделывать свои представления под окружающую действительность, а не сетовать, что окружающая действительность не соответствует собственным представлениям. Проблема, собственно, в чем? При запуске отчета вы формируете таблицу с огромным количеством записей. Таблица временная, и при следующем запуске отчета она будет формироваться с нуля. Это работает медленно. Так? А что нельзя сделать так, чтобы таблица, которую ты формируешь, была не временной, а постоянной? Тогда отпадает огромное количество проблем. В частности, не нужно проверять, создал ее кто-то секунду назад и не исчезла ли она через миллисекунду после проверки ее существования. Содержимое таблицы может формироваться триггерами в процессе пополнения и модификации основных таблиц. Отчеты строятся по таблице ТОЛЬКО операциями SELECT. Модификации затрагивают единичные записи и не требуют блокировки всей таблицы. Результат: работа отчетов ускоряется в несколько раз, добавление новых проводок замедляется на ничтожно малую величину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 11:12 |
|
||
|
О вреде транзакций, или "Как же отключить transaction log?"
|
|||
|---|---|---|---|
|
#18+
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. В виду того, что пока вроде бы товарищ Б.Гейтс не собирается реализовывать то, что мне хотелось бы, а так же в виду полной риторичности моего вопроса, предлагаю тему закрыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2003, 20:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=35&tid=1554290]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
89ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 434ms |

| 0 / 0 |
