Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
вставка и обновление таблицы происходит из процедур. когда один пользователь вставляет новую строку у второго при обновлении других строк происходят тормоза. как от этого избавиться? я так понимаю тут надо работать с уровнями транзакций? подскажите как?

процедура вставки:
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[InsertTable1]
               (@A int,
                @B int,
                @Text varchar(MAX),
                @Result int out)
AS
    begin tran	

        Insert into Table1
        Values (@A,
                @B,
                @Text)

        Select @Result =  SCOPE_IDENTITY()

        if @@error != 0 
        begin
            Select @Result = 0 
            rollback tran
            return   
        end    
    commit tran

процедура обновления
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[UpdateTable1]
               (@Key int,
                @A int,
                @B int,
                @Text varchar(MAX),
                @Result int out)
AS
    begin tran	

        Update Table1
        Set  
               A= @A,
               B= @B, 
               Text = @Text
        Where  Key= @Key

        Select @Result =  1

        if @@error != 0 
        begin
            Select @Result = 0 
            rollback tran
            return   
        end    
    commit tran


Сообщение было отредактировано: 19 апр 13, 16:01
19 апр 13, 15:04    [14204394]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
hisp89
вставка и обновление таблицы происходит из процедур. когда один пользователь вставляет новую строку у второго при обновлении других строк происходят тормоза. как от этого избавиться? я так понимаю тут надо работать с уровнями транзакций? подскажите как?
Для одной записи это невжно, всё равно начинается неявная транзакция, которая сама откатится в случае ошибки. Так что всё управление транзакциями можно из процедуры убрать.

Ну и процедура у вас неправильная, она по любому будет коммитить в случае ошибки и возвращать @Result = 0

Потому что @@error возвращает ошибку последнего выполненного оператора (а вы думали, предпоследнего?).
19 апр 13, 15:51    [14204843]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
alexeyvg,
одновременно инсертят много пользователей, причем почти безостановочно. в это же время несколько юзеров готовые записи апдейтят. вот они то не могут дождаться сервака (пара секунд на апдейт, для работы слишком много). как организовать работу? я близко с субд не работал. может при инсерте блокируется вся таблица? как это обойти?
19 апр 13, 16:04    [14204946]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
hisp89
одновременно инсертят много пользователей, причем почти безостановочно. в это же время несколько юзеров готовые записи апдейтят. вот они то не могут дождаться сервака
Много - это сколько, сотня тысяч пользователей?

Время вставки или обновления редко превышает одной милисекунды, так что обычно при работе с одной записью проблем не возникает.
hisp89
я близко с субд не работал. может при инсерте блокируется вся таблица? как это обойти?
При инсёрте блокируется одна запись
На практике блокируется больше, т.к. обычно у таблицы есть индексы, констрейны и т.д., но если транзакция короткая, то всё нормально.

Нужно найти конкретные причины тормозов, ну и в общем решать проблемы с субд должен специалист, наверное, можно такого найти, раз у вас такая сильно нагруженная система?
19 апр 13, 16:11    [14205015]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
У вас на Key есть индекс-то?
19 апр 13, 16:14    [14205039]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 340
hisp89,

Выложи скрипт создания таблицы.
Непонятно, что является первичным ключем, какие есть индексы...
19 апр 13, 16:19    [14205095]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
alexeyvg,
на таблицу так же повешено несколько триггеров, это может сильно затормозить работу?
а я разбираюсь потому что при любых тормозах в проге за которую отвечаю, мне говорят "почему" и "убери". хотя висит сервер а не прога(в порге нет тяжелых запросов к базе)
19 апр 13, 16:25    [14205158]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
DirksDR,
по примеру ключ 'key', реальная таблица отличается только количеством полей
19 апр 13, 16:28    [14205181]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
hisp89
а я разбираюсь потому что при любых тормозах в проге за которую отвечаю, мне говорят "почему" и "убери". хотя висит сервер а не прога(в порге нет тяжелых запросов к базе)


типичные отмазы говнокодеров, сорри
19 апр 13, 16:29    [14205202]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
hisp89
на таблицу так же повешено несколько триггеров, это может сильно затормозить работу?


Хороший вопрос. мож в триггере у вас там курсором таблица из млн. записей перебирается. = может
19 апр 13, 16:32    [14205225]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
Knyazev Alexey,
дохрена умный, так предложи решение
19 апр 13, 16:33    [14205233]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Glory
Member

Откуда:
Сообщений: 104760
hisp89
дохрена умный, так предложи решение

Взять мониторинг и узнать, чего ждет запрос "у второго при обновлении других строк происходят тормоза"
А то вы так уверены в правильности своем коде и вине сервера
19 апр 13, 16:35    [14205247]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
hisp89,

ну как вам сказали сами процедуры неправильные,ето раз
а два..кто знает ,что у вас там в триггерах то творится
а три - хамить не стоит
19 апр 13, 16:37    [14205275]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
BlackRaider,
пример триггера при отключении которого значительно повышается скорость
ALTER TRIGGER [dbo].[AdvQPStatusInsert]
ON [dbo].[Advertisements]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO AdvertStatusNotify(AdvertisementId) ( select AdvertisementID from inserted except select AdvertisementID from AdvertStatusNotify)
UPDATE AdvertStatusNotify SET Notified=0 where AdvertisementId in (select AdvertisementID from inserted)
END
19 апр 13, 16:44    [14205329]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
hisp89,

Полагаю на этих таблицах тоже тригера?;)
19 апр 13, 16:48    [14205366]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
BlackRaider,
нет, только при любом изменении Advertisements повешены триггеры, для заполнения нескольких таблиц
19 апр 13, 16:53    [14205434]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
hisp89,

а че ето не сделать 1 операцией то ??? зачем 2 команды на 1 движение ?
19 апр 13, 16:53    [14205436]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
Maxx,
сам не знаю, наверно проще было так сделать, либо база корректировалась по мере надобности, поэтому и вешали триггеры
19 апр 13, 16:58    [14205474]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
hisp89,

я ваще про тело триггера
19 апр 13, 17:00    [14205493]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Maxx а как одной сделать? что то я не соображу.

там идет вставка тех ИД которых нет из инсерта.
и апдейт всех что были в инсерте.

а индексы на эту таблицу ну и оббъемы ее?
19 апр 13, 18:40    [14206180]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
hisp89,

и еще вопрос, инсертят оптом или только по одной записи?
19 апр 13, 19:30    [14206347]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
hisp89
Member

Откуда:
Сообщений: 10
BlackRaider,
инсертят по одной записи. в таблице на каждое действие(инсерт, апдейт, делет) написано по три триггера(запись в три таблицы) т.е. при каждом действии над таблицей срабатывает три триггера.
вопрос: если все действия записать в одну транзакцию (т.е. производим запись в таблицу, после пишем результаты в три необходимых таблицы), это повысит скорость по сравнению с триггерами или нет??
22 апр 13, 10:01    [14211316]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
hisp89,

У вас и так эти три триггера выполняются в одной транзакции.
22 апр 13, 10:09    [14211345]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
hisp89
пример триггера при отключении которого значительно повышается скорость
Наверняка нету индекса на поле AdvertisementId в таблице AdvertStatusNotify. Или есть?

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

Для этого используют профайлер, читают планы запросов.
22 апр 13, 10:16    [14211388]     Ответить | Цитировать Сообщить модератору
 Re: Как повысить скорость при insert и update  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
hisp89
в таблице на каждое действие(инсерт, апдейт, делет) написано по три триггера(запись в три таблицы) т.е. при каждом действии над таблицей срабатывает три триггера.
вопрос: если все действия записать в одну транзакцию (т.е. производим запись в таблицу, после пишем результаты в три необходимых таблицы), это повысит скорость по сравнению с триггерами или нет??


А зачем по 3 на каждый чих? (почему по 1-му то не сделать, хотя мож так удобнее..)

как написали выше у вас и так все в одной транзакции...

какие индексы есть на AdvertStatusNotify?
22 апр 13, 10:48    [14211549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить