Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация INSERT'a, используется тригер 
:(
    Опции темы
Kolia
Дата 20.7.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

Репутация: нет
Всего: нет



Объясню суть проблемы. Имеется таблица. ID для нее генерировался по определенному алгоритму и имел тип VARCHAR(20). Еще до INSERT'a генерировался этот ID и вместе с INSERT'ом шел в таблицу
Код

@id = generate_id()
insert into my_table(id, ...)
values(@id, ...)


Почему было организовано именно так я сказать не могу. Не учавствовал в этом. 

Выяснилось, что такой подход в ряде случаев себя не оправает. Придумал такой способ генерации: вставить поле id_identity типа IDENTITY и повесить тригер на INSERT. Тригер берет значение id_identity новой строки, конвертирует его в VARCHAR(20) и вставляет в ID новой строки

Код

ALTER    TRIGGER tbl.trg_amschedule_generate_id_ins
    ON tbl.my_table
    FOR INSERT
AS
    DECLARE @id_identity bigint

    SELECT    @id_identity = id_identity
    FROM    inserted

    UPDATE    tbl.my_table
    SET    id = convert(varchar(24), @id_identity)
    WHERE    id_identity = @id_identity


В итоге я имею довольно внушительное снижение производительности :( В эту таблицу вставляют довольно много данных. Ограничение такое, что PRIMARY KEY (ID) должен остаться старым, т.е. такого же типа. Иначе потребуется переписка огромного числа строк кода.

Вот у меня такой вопрос: можно ли узнать IDENTITY до того, как поизойдет запись в таблицу. То есть я хочу в тригере получить IDENTITY, из него сделать ID, и полученую строку уже пихать в базу.

В варианте, который привел выше, этот участок и дает тормоз (~0.3 сек.)
Код

UPDATE    tbl.my_table
SET    id = convert(varchar(24), @id_identity)
WHERE    id_identity = @id_identity

--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
SergKO
Дата 20.7.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



Поле id_identity индексировано?
Поле id - кластерный индекс?

Замена
Цитата(Kolia @  20.7.2007,  12:54 Найти цитируемый пост)
SELECT    @id_identity = id_identity
    FROM    inserted

на
Код

SELECT    @id_identity = @@IDENTITY

по крайней мере уменьшает количество чтений.
PM MAIL   Вверх
Kolia
Дата 23.7.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

Репутация: нет
Всего: нет



Цитата(SergKO @ 20.7.2007,  14:55)
Поле id_identity индексировано?
Поле id - кластерный индекс?

Замена
Цитата(Kolia @  20.7.2007,  12:54 Найти цитируемый пост)
SELECT    @id_identity = id_identity
    FROM    inserted

на
Код

SELECT    @id_identity = @@IDENTITY

по крайней мере уменьшает количество чтений.

Индексировано.
Но быстрее не работает
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
SergKO
Дата 23.7.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



Цитата(Kolia @  20.7.2007,  12:54 Найти цитируемый пост)
ID для нее генерировался по определенному алгоритму 

Поле заполняется по старому алгоритму, а затем апдейтится?
И еще раз
Цитата(SergKO @  20.7.2007,  14:55 Найти цитируемый пост)
Поле id - кластерный индекс?


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.