|
|
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
Работаю с MS SQL Server 2000 Оптимизировал однажды одну штуку. Столкнулся с тем что update одной записи выполняется 15мс. Это очень долго. Специфика была такова, что обновлялось много записей, большая часть которых не менялась, но заранее я не мог знать какие именно записи поменялись. Это дело с легкостью оптимизировалось написанием хранимой процедуры, которая сперва доставала запись и БД, сравнивала и только потом обновляла. Можно было триггер написать. В результате необходимость в фиксации транзакции в большинстве случаев отпала, т.к. записи не было, и скорость работы в среднем возросла в 20 раз. Внимание вопрос! Реализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 08:43 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
>которая сперва доставала запись и БД, сравнивала и только потом обновляла открой для себя то что в update можно написать WHERE Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 09:08 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторОптимизировал однажды одну штуку. Столкнулся с тем что update одной записи выполняется 15мс. А можно увидеть эту "одну" штуку? И чем выполнялись замеры?! авторСпецифика была такова, что обновлялось много записей, большая часть которых не менялась, но заранее я не мог знать какие именно записи поменялись. ТАк что же все-таки происходило на самом деле? Кривонаписанный код с курсором? авторЭто дело с легкостью оптимизировалось написанием хранимой процедуры, которая сперва доставала запись и БД, сравнивала и только потом обновляла. Какое "это дело"? Кривой код? Доставала из бд и сравновала с чем? Почему надо было обрабатывать по-одной записи, а не обновить все подпадающие под условия обновления? авторВ результате необходимость в фиксации транзакции в большинстве случаев отпала, т.к. записи не было, и скорость работы в среднем возросла в 20 раз. Эээ... Позаписное обновление и для каждой записи отдельная транзакция? авторРеализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких? Какая? Вы имеете ввиду, что СУБД ничего не должна сделать, при отправке ей инструкции вида: Код: plaintext 1. 2. 3. ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 09:13 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
ScareCrow >которая сперва доставала запись и БД, сравнивала и только потом обновляла открой для себя то что в update можно написать WHERE Точно! Блин... Ну все равно ж надо where писать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 09:35 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirНу все равно ж надо where писать А то?! А иногда и JOIN несколько раз во FROMе, а еще derived tables и прочую всякую всячину, относящууюся к программированию на T-SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 09:39 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin авторОптимизировал однажды одну штуку. Столкнулся с тем что update одной записи выполняется 15мс. А можно увидеть эту "одну" штуку? И чем выполнялись замеры?! Увидеть нет. Все не так просто на самом деле. Замеры выполнялись профайлером. И показаниями системного таймера уже непосредственно в приложении. авторСпецифика была такова, что обновлялось много записей, большая часть которых не менялась, но заранее я не мог знать какие именно записи поменялись. ТАк что же все-таки происходило на самом деле? Кривонаписанный код с курсором? Какой курсор? Примерно так. Пользователь выгружает некий справочник, в моем случае в Excel. Но это не важно, с тем же успехом могли быть dbf и т.п.. Правит его у себя и загружает обратно. Зачем его целиком таскать мне самому непонятно. авторЭто дело с легкостью оптимизировалось написанием хранимой процедуры, которая сперва доставала запись и БД, сравнивала и только потом обновляла. Какое "это дело"? Кривой код? Доставала из бд и сравновала с чем? Почему надо было обрабатывать по-одной записи, а не обновить все подпадающие под условия обновления? Мне данные снаружи приходят. авторВ результате необходимость в фиксации транзакции в большинстве случаев отпала, т.к. записи не было, и скорость работы в среднем возросла в 20 раз. Эээ... Позаписное обновление и для каждой записи отдельная транзакция? Batch-режим - это отдельный разговор. Меня интересует уже чисто теоретический момент. Ну ладно когда от одного пользователя пришли данные, я их могу скопом запихать, а вот если у меня много пользователей. авторРеализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких? Какая? Вы имеете ввиду, что СУБД ничего не должна сделать, при отправке ей инструкции вида: Код: plaintext 1. 2. 3. ??? Если фактически данные не изменяются, то СУБД не должна их обновлять. Поймите правильно. Сейчас все работает нормально. Проблем у меня нет. Меня волнует один единственный вопрос, почему, если данные не изменились, СУБД все равно их обновляет и фиксирует транзакцию. Не легче ли их просто оставить как есть? Или здесь какой-то тайный смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 09:55 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin Самоловских Виталий aka KefirНу все равно ж надо where писать А то?! А иногда и JOIN несколько раз во FROMе, а еще derived tables и прочую всякую всячину, относящууюся к программированию на T-SQL. Тупо: есть таблица mytable с полями ind id varchar name В ней запись: 1 ляляля Делаем так update mytable set name='ляляля' where id=1 выполняется 15 мс и ничего при этом не меняет. update mytable set name='ляляля' where id=1 and name<>'ляляля' выполняется быстро и ничего при этом не меняет. Вот это меня и напрягает. Почему я должен писать дополнительное условие, добавлять параметр к запросу, почему это не реализовано на уровне СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 10:01 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторЗамеры выполнялись профайлером. Профайлер в 2000 выдает саттистику с точность в половину точности типа данных datetime - около 16 миллисекунд. Так что все Ваши измерения "приблизительно потолочные". авторИ показаниями системного таймера уже непосредственно в приложении. Как в приложении системным таймером можно измерить время выполнения запроса на сервере ?! авторПримерно так. Пользователь выгружает некий справочник, в моем случае в Excel. Но это не важно, с тем же успехом могли быть dbf и т.п.. Правит его у себя и загружает обратно. Зачем его целиком таскать мне самому непонятно. Абалдеть архитектурка... авторBatch-режим - это отдельный разговор. Меня интересует уже чисто теоретический момент. Ну ладно когда от одного пользователя пришли данные, я их могу скопом запихать, а вот если у меня много пользователей. Какой момент Вас интересует? И про "много пользователей" проблема не понятна?! авторЕсли фактически данные не изменяются, то СУБД не должна их обновлять. И это она еще должна сделать на стадии, когда только пользователь подумал. Да? Ваша задача, как разработчика, создать необходимый алгоритм обработки данных. авторМеня волнует один единственный вопрос, почему, если данные не изменились, СУБД все равно их обновляет и фиксирует транзакцию. Потому что она делает то, что ей велели (в коде). Как Вы напишите код, так и будет вести себя СУБД. авторНе легче ли их просто оставить как есть? С чего бы СУБД проявлять самодеятельность?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 10:14 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторДелаем так update mytable set name='ляляля' where id=1 выполняется 15 мс и ничего при этом не меняет. Щаз, не меняет. Это Вы в курсе, что новое значение и старое совпадает. Вы попросили СУБД явно проставить значение в поле записи. Зачем ей проявлять самодеятельность (тратя на это доп ресуры) и сравнивать старое и новое значение. Она честно (грубо): 1. Откроет транзакцию. 2. Запишет изменения в лог. 3. Изменит запись. 4. Если нет ошибок, закоммитит. авторupdate mytable set name='ляляля' where id=1 and name<>'ляляля' выполняется быстро и ничего при этом не меняет. А то?! Менять то нечего, ибо нет записей, подпадающих под условия отбора. авторПочему я должен писать дополнительное условие, добавлять параметр к запросу, почему это не реализовано на уровне СУБД? Патамушто разумом наделены Вы, а не СУБД. И в Ваших руках управление СУБД. ЗЫ. Если писать не хочется, то, м.б. стоит поискать себе другое занятие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 10:21 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin авторДелаем так update mytable set name='ляляля' where id=1 выполняется 15 мс и ничего при этом не меняет. Щаз, не меняет. Это Вы в курсе, что новое значение и старое совпадает. Вы попросили СУБД явно проставить значение в поле записи. Зачем ей проявлять самодеятельность (тратя на это доп ресуры) и сравнивать старое и новое значение... Как Вам чуть выше продемонстрировали - если проверять значение - ресурсов тратиться меньше pkarklinЗЫ. Если писать не хочется, то, м.б. стоит поискать себе другое занятие? На то и сервер чтобы за меня делать тупую работу 2 Самоловских Виталий aka Kefir Вы не учитываете, что сервер на каждый апдейт еще создаётся deleted и inserted, а для этого имеет значение делаете вы апдейт ничего не меняя или не делаете. Может быть у Вас еще триггер есть? 15мс как-то многовато ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 11:19 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin Как в приложении системным таймером можно измерить время выполнения запроса на сервере ?! Я где-то сказал, что это 1 запрос? Мне в сущности все равно сколько времени выполняется запрос. Меня интересует время реакции системы. Именно про него я говорил, когда имел ввиду в 20 раз. авторПримерно так. Пользователь выгружает некий справочник, в моем случае в Excel. Но это не важно, с тем же успехом могли быть dbf и т.п.. Правит его у себя и загружает обратно. Зачем его целиком таскать мне самому непонятно. Абалдеть архитектурка... А Вы уверены, что ваши пользователи используют вашу систему так как Вы задумывали? Какой момент Вас интересует? И про "много пользователей" проблема не понятна?! Запросы от нескольких пользователей в одну транзакцию не запихать. Ну можно, но это изврат. Так что batch-режим в этом случае не поможет. авторМеня волнует один единственный вопрос, почему, если данные не изменились, СУБД все равно их обновляет и фиксирует транзакцию. Потому что она делает то, что ей велели (в коде). Как Вы напишите код, так и будет вести себя СУБД. А вот и нет. SQL относится к языкам сверхвысокого уровня. Я не должен говорить как, я должен говорить что. авторНе легче ли их просто оставить как есть? С чего бы СУБД проявлять самодеятельность?! С того что в ряде случаев это будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 11:21 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
SergSuper Может быть у Вас еще триггер есть? 15мс как-то многовато Нет. Это чистый апдейт. Сервак старенький, винты медленные. Быстрее не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 11:27 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
SergSuperКак Вам чуть выше продемонстрировали - если проверять значение - ресурсов тратиться меньше Ну так и пишите запрос у словием проверки. Почему сервер должен "додумывать" это за разработчика. Б.м. Вы мне приведете ссылки на языки, которые в случие явно прописанного в коде (абстрактно): Var1 = <SomeValue> будет проверять значение, которое уже есть в Var1 и если оно равно <SomeValue>, не будет выполнять присвоения. SergSuperНа то и сервер чтобы за меня делать тупую работу Знаете за что я не люблю Excel - за то, что он начинает "делать за меня тупую работу". Вставьте значение банковского счета в ячейку на чистом листе и уйдите с нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 11:59 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin Знаете за что я не люблю Excel - за то, что он начинает "делать за меня тупую работу". Вставьте значение банковского счета в ячейку на чистом листе и уйдите с нее. Вы е любите а я люблю. Я же не сказал что сервер обязан делать такую проверку. Я во-первых спросил: "Реализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких?" Пользоваться ими или нет это сугубо Ваше, в Вашем случае, и мое, в моем, дело. Вы вскользь упомянули, что на это тратятся дополнительные ресурсы. Единственное конструктивное высказывание по вопросу. Но позвольте, разве при апдейте не копируются страницы, разве искомая запись не попадает в оперативку в любом случае? В моем понимании для такой проверки потребуются лишь несколько дополнительных тактов процессора. Которые в случае фиксации транзакции в БД стоят несоизмеримо меньше, чем скорость записи на жесткий диск. И такая проверка никак не повлияет на скорость выполнения транзакции. Если я ошибаюсь, то, не могли бы Вы меня просветить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 12:09 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklinБ.м. Вы мне приведете ссылки на языки, которые в случие явно прописанного в коде (абстрактно): Var1 = <SomeValue> будет проверять значение, которое уже есть в Var1 и если оно равно <SomeValue>, не будет выполнять присвоения. Аналогия неуместна (с) Формула Любви Если мы держим переменную в памяти, то скорость записи примерно равна скорости чтения. Плюс куча всяких кэшей, короче эффекта никакого. В случае БД: 1. Скорость чтения ОЗУ заметно выше, чем скорость записи на диск. 2. Запись с большой вероятностью может находиться в ОЗУ. 3. В любом случае происходит чтение страницы с записью и она попадает в ОЗУ. Таким образом дополнительная проверка может дать (и дает) значительный эффект в производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 12:17 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторЯ где-то сказал, что это 1 запрос? Мне в сущности все равно сколько времени выполняется запрос. Меня интересует время реакции системы. Именно про него я говорил, когда имел ввиду в 20 раз. Да Вы вообще мало чего говорите техничеком плане. Ведете речь об улучшайзинге "одной штуки" и "этого дела". В результат виноватым оказывается сервер в том что он оказался не прозорливым и не додумал за Вас. авторА Вы уверены, что ваши пользователи используют вашу систему так как Вы задумывали? Угу. Уверен. авторЗапросы от нескольких пользователей в одну транзакцию не запихать. Ну можно, но это изврат. Так что batch-режим в этом случае не поможет. От нескольких пользователей в текущей постановке - нет. А вот хотя бы все запросы одного клиента завернуть в общую транзакцию стоит. авторА вот и нет. SQL относится к языкам сверхвысокого уровня. Я не должен говорить как, я должен говорить что. Вы и говорите, "что", но "как" - определено "by design", а не так как Вы предполагаете. авторС того что в ряде случаев это будет быстрее. Но не будет соответствовать семантике запроса! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 12:57 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin авторЯ где-то сказал, что это 1 запрос? Мне в сущности все равно сколько времени выполняется запрос. Меня интересует время реакции системы. Именно про него я говорил, когда имел ввиду в 20 раз. Да Вы вообще мало чего говорите техничеком плане. Ведете речь об улучшайзинге "одной штуки" и "этого дела". В результат виноватым оказывается сервер в том что он оказался не прозорливым и не додумал за Вас. Я не виду речь об улучшайзинге конкретной штуки. И сервер ни в чем не виноват. Каким бы ни был сервер в конечном итоге скорость фиксации транзакции зависит от скорости винтов и от этого никуда не деться. Вот это о чем-нибудь Вам говорит? "Внимание вопрос! Реализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких?" Это было в моем 1м сообщении!!! Меня не интересует Ваше мнение обо мне и о моей системе. Меня интересует ответ на конкретный вопрос: "Реализована ли подобная проверка в каких-нибудь СУБД? Если да, то в каких?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 13:25 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirВы вскользь упомянули, что на это тратятся дополнительные ресурсы. Единственное конструктивное высказывание по вопросу. Но позвольте, разве при апдейте не копируются страницы, разве искомая запись не попадает в оперативку в любом случае? В моем понимании для такой проверки потребуются лишь несколько дополнительных тактов процессора. Которые в случае фиксации транзакции в БД стоят несоизмеримо меньше, чем скорость записи на жесткий диск. И такая проверка никак не повлияет на скорость выполнения транзакции. Если я ошибаюсь, то, не могли бы Вы меня просветить? Т.е. Вы хотите, чтобы все, ято связано с изменением значение поля завязывалось на его значение на уровне ядра, а не на уровне разработки? Возможно, когда-нибудь, ANSI и придумет какую-нибудь дополнительную клаузу в UPDATE типа Код: plaintext 1. 2. 3. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 13:33 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin Т.е. Вы хотите, чтобы все, ято связано с изменением значение поля завязывалось на его значение на уровне ядра, а не на уровне разработки? ДА! ДА! ДА! Именно об этом я и спрашиваю!!! Вполне логично допустить, что где-то это уже реализовано. Вот я и хочу это знать. Залезть в дебри пары десятков популярных СУБД для одного человека не представляется возможным, поэтому я и задаю этот вопрос на форуме. Может кто-нибудь скажет: "А вот в VasiaPupkinSQL это уже давно реализовано!" Возможно, когда-нибудь, ANSI и придумет какую-нибудь дополнительную клаузу в UPDATE типа Код: plaintext 1. 2. 3. :) Будем надеяться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 13:38 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторЯ не виду речь об улучшайзинге конкретной штуки. И сервер ни в чем не виноват. Гы... Это кто сказал: авторРаботаю с MS SQL Server 2000 Оптимизировал однажды одну штуку. Столкнулся с тем что update одной записи выполняется 15мс. Это очень долго ? Дальше, как оказывается, таки был кривой код, улучшайзингом которого Вы занялись, убрав лишние UPDATEты. Потом всплыло, что фиксация транзакции выполнялась для каждой изменяемой записи. И в конце концов Вам "захотелось найти СУБД" (о чем Вы и спросили) которая вместо Вас будет заниматься улучшайзингом. авторМеня не интересует Ваше мнение обо мне и о моей системе. Вне зависомости от того, интересует оно Вас или нет, нравится Вам это или нет, я имею право его высказывать в пределах Правил форума. Вам или придется с этим мирится или больше не задавать здесь вопросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 13:46 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
авторБудем надеяться. Не думаю, что это кому-нибудь придет в голову, ибо это реализуется уже существующим набором клауз. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 13:50 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin Дальше, как оказывается, таки был кривой код, улучшайзингом которого Вы занялись, убрав лишние UPDATEты. Не кривой, а плохо оптимизированный :-\ И, естественно, я бы хотел чтобы оптимизацией занималась СУБД. Не вижу в этом ничего плохого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 14:48 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirИ, естественно, я бы хотел чтобы оптимизацией занималась СУБД. Не вижу в этом ничего плохого. Ну, она занимается в силу своих возможностей. Но не на уровне "перекраивания" инструкций. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 14:52 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirВот это меня и напрягает. Почему я должен писать дополнительное условие, добавлять параметр к запросу, почему это не реализовано на уровне СУБД? В отсутствии транзакций действительно такое пожелание возможно, но тогда это уже не будет полноценная СУБД. Так что тут проблемы глубже. Вся пакость в том, что в общем случае два следующие запроса могут привести БД к разным состояниям: Код: plaintext Код: plaintext Соответственно (я так предполагаю), разработчики не выполняют такую оптимизацию. Другими словами, это вовсе не вопрос эффективности, а разная эффективность это следствие разных планов выполнения запросов. Это легко продемонстрировать. После первого запроса гарантировано все поля будут равны 'lalala'. А вот после второго запроса это вовсе не гарантировано, поскольку те поля, который уже были равны 'lalala' (а потому исключены) могут быть в процессе выполнения приравнены к какому-то другому значению (конкурентным запросом). Такие ситуации часто встречаются, например, с неравенствами тоже подобного рода проблемы могут возникнуть. Возможно, такая оптимизация включается автоматически в какой-то СУБД, если отключить транзакции или понизить уровень (ну и нужны индексы конечно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 15:52 |
|
||
|
Скорость update
|
|||
|---|---|---|---|
|
#18+
pkarklin SergSuperКак Вам чуть выше продемонстрировали - если проверять значение - ресурсов тратиться меньше Ну так и пишите запрос у словием проверки. Почему сервер должен "додумывать" это за разработчика. Б.м. Вы мне приведете ссылки на языки, которые в случие явно прописанного в коде (абстрактно): Var1 = <SomeValue> будет проверять значение, которое уже есть в Var1 и если оно равно <SomeValue>, не будет выполнять присвоения. Посмотрите исходники VCL - почти все проперти так реализованы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2007, 16:02 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=35035102&tid=1553194]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 372ms |

| 0 / 0 |
