powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая выборка из INSERTED\DELETED во временную таблицу
138 сообщений из 138, показаны все 6 страниц
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782550
Добрый день, товарищи!
Столкнулся с проблемой долгой выборки из дрянотаблиц INSERTED\DELETED в [таблицу\временную_таблицу\табличную_переменную].

Конкретнее. Имеем два стейтмента.

SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED
и
SELECT "ПОЛЕ" INTO #T_INSERTED FROM "Таблица_на_которой_стоит_триггер"

В таблице 350000 записей. Проводится апдейт всех записей по некому полю, думаю не важно по какому.
Результат: 45сек и 0,5 сек. Притом результат один и тотже что выбирать ВСЕ столбцы, что один какой либо. Даже если написать
SELECT 1 INTO #T_INSERTED FROM INSERTED
, то всеравно будет тарабанить 45 сек.

Кто сталкивался? Есть вообще идеи почему к обращению к INSERTED\DELETED идет так долго?
з.ы. SELECT 1 FROM INSERTED тоже тарабанит 45 сек. Вообще без разницы что пытаешься сделать- время всегда одно и тоже. Ну за исключением попытки фильтрации и сортировки оных псевдотейблов.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782568
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

это для выполнения DSQL в триггере?
Или для выполнения процедуры, обрабатывающей inserted/deleted?

В других случаях не могу представить, зачем копировать эти псевдотаблицы во временные
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782574
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какие ожидания у сессии во время этих 45 секунд?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782575
Да, мне надо их потом, асинхронно обработать. Для логирования вобщем надо. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782577
pkarklin,

Никаких. Нулл в типе ожидания.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782580
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаpkarklin,

Никаких. Нулл в типе ожидания.

Запускайте UPDATE с включенным SET STATISTICS TIME и IO. Посмотрим, на что тратится время.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782582
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаpkarklin,

Никаких. Нулл в типе ожидания.
а в ресурсе?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782584
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаПритом результат один и тотже что выбирать ВСЕ столбцы, что один какой либо.Точно? А то, может, на таблице есть индекс с искомым полем, а таблица широкая...

Да, с таким не сталкивался...
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782588
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаете угадать, что Вы написали в триггере?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782589
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовПредлагаете угадать, что Вы написали в триггере?А как от этого может зависеть операция "SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED"? Зачем эта информация нужна?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782595
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВладислав КолосовПредлагаете угадать, что Вы написали в триггере?А как от этого может зависеть операция "SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED"? Зачем эта информация нужна?А я подозреваю, что копирование deleted/inserted вообще не нужно.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782615
2pkarklin, для инсертеда статистика ИО не доступна. По крайней мере мне не выдает. Только по физической табличке.

2Владислав Колосов, так я написал же что там. там сейчас два запроса. Вам прямо конкретные названия моих таблиц надо? Бесполезны они вам будут. :)

2iap, я с радостью с Вам потрещу по этой теме потом. Когда Вы столкнетесь с необходимостью логирования изменений большго объема. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782616
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap, да, как-то подозрительно выглядит.
Не факт, что всё происходит так, как описывает автор.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782618
msLex, в ресурсе тоже пусто.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782619
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона, только одна строчка в триггере?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782626
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона2pkarklin, для инсертеда статистика ИО не доступна. По крайней мере мне не выдает. Только по физической табличке.

Ну так покажите, что Вы получили, выполняя UPDATE при установленных SETах.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782627
2Владислав Колосов, товарищ, давайте вы найдете где-нибудь у себя в закромах табличку с 300000+ записей и с порядка 70 полями. Запустите апдейт какого-либо поля по всем записям, в триггере напишете SELECT 1 FROM INSERTED , заключив этот запрос в SELECT GETUTCDATE() . И только потом будете утверждать что я что то тут выдумываю. Договорились? ;)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782629
pkarklin, "Table 'FD_Charge_Details'. Scan count 566, logical reads 8981, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0."

Владислав, Остальное в тирггере не выполняется. После обозначенных запросов ретурн поставл я.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782632
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаКогда Вы столкнетесь с необходимостью логирования изменений большго объема. :)Ой, и правда! Что же я все эти 17 лет делал-то?!
Ни разу не логировал такие серьёзные таблицы!
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782634
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотоназаключив этот запрос в SELECT GETUTCDATE() .Это как?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782635
iap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782638
iap, это вот таг. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782640
iap, пардон. рука на контролэнтер дрогнула. :)

SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT GETUTCDATE(), 'START'


SELECT F_Division, LINK INTO #T_INSERTED FROM INSERTED
SELECT GETUTCDATE(), 'INSERTED'



SELECT * INTO #T_INSERTED2 FROM PE.FD_Charge_Details
SELECT GETUTCDATE(), 'FD_Charge_Details'


SET STATISTICS TIME OFF
SET STATISTICS IO OFF
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782641
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаpkarklin, "Table 'FD_Charge_Details'. Scan count 566, logical reads 8981, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0."

Владислав, Остальное в тирггере не выполняется. После обозначенных запросов ретурн поставл я.

А статистика TIME? Если триггера нет, что будет со статистикой?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782643
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

SET установите в баче, который запускает UPDATE, а не в триггере.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782646
pkarklin, Вот всё что в мессаге.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 13 ms.

SQL Server Execution Times:
CPU time = 48971 ms, elapsed time = 49592 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'FD_Charge_Details'. Scan count 566, logical reads 8981, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 4927 ms, elapsed time = 583 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782650
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаiap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :)Я, кажется, догадался.
Речь идёт о легендарном "универсальном триггере"?
Который по метаданным собирает запрос логгирования для полей любой таблицы,
к которой прицеплен такой "универсальный триггер"?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782652
pkarklinАцкийСкотона,

SET установите в баче, который запускает UPDATE, а не в триггере.


тож самое. за исключением что промелькнули еще таблицы, ключи на которые я апдейтил. но затор не там же.

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ED_Registr_Pts_Period'. Scan count 1, logical reads 266, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ED_Registr_Pts'. Scan count 1, logical reads 402, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ED_Network_Pts'. Scan count 1, logical reads 2949, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'FD_Charge_Details'. Scan count 566, logical reads 8981, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server parse and compile time:
CPU time = 11919 ms, elapsed time = 11951 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Вот вход в триггер
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

Это селект из инсертеда.
SQL Server Execution Times:
CPU time = 49091 ms, elapsed time = 48702 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'FD_Charge_Details'. Scan count 566, logical reads 8981, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Это напрямую из таблицы на которой висит триггер.
SQL Server Execution Times:
CPU time = 5758 ms, elapsed time = 580 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 66768 ms, elapsed time = 61235 ms.

(342399 row(s) affected)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782656
iapАцкийСкотонаiap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :)Я, кажется, догадался.
Речь идёт о легендарном "универсальном триггере"?
Который по метаданным собирает запрос логгирования для полей любой таблицы,
к которой прицеплен такой "универсальный триггер"?

Ф точку. Только триггер не посвящен целиком логированию, там еще бизнес-логика. :) И с чего же легендарный он? От завершения меня отделяет только эта идиотская задержка, которой я моуг по идее принебречь. Подождут пользаки уже немонго. Всеравно вола валяют почти весь день. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782667
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаОт завершения меня отделяет только эта идиотская задержкаВот именно!
Вот поэтому-то я давным-давно бросил эту идею.
Плавали - знаем.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782672
iapАцкийСкотонаОт завершения меня отделяет только эта идиотская задержкаВот именно!
Вот поэтому-то я давным-давно бросил эту идею.
Плавали - знаем.

Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782681
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.можно же написать генератор кода
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782683
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаiapпропущено...
Вот именно!
Вот поэтому-то я давным-давно бросил эту идею.
Плавали - знаем.

Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.Проще логгировать записи, в которых изменилось хоть что-то, целиком.
И с таким логом проще жить потом.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782691
Shakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782695
iapАцкийСкотонапропущено...


Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.Проще логгировать записи, в которых изменилось хоть что-то, целиком.
И с таким логом проще жить потом.

Так чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы. К тому же, я уже упоминал, в триггере не только логирование. Есть еще триггеры с бизнес-логикой. И дикое торможение этих дурацких таблиц так же снижает и ее.



Ну так что, знает кто причину почему тормозит выборка с псевдотаблиц?:)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782698
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаShakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :)

насчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782703
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТак чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы.Странное утверждение.
Главное, что надо сделать - забыть об универсальности.
И заниматься логгированием каждой таблицы в отдельности.
Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой
с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе.

Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ
можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!).
Да что там! Это логгирование можно оформить как отдельный триггер,
а бизнес-логика пусть будет в другом! Триггеров же может быть много!
Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782709
ShakillАцкийСкотонаShakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :)

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

Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782721
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

Scan count 566 - очень много. Интересно, какой результат будет, если вы уберете триггер и воспользуетесь кляузой OUTPUT в UPDATE?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782723
tarrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаShakillпропущено...


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

Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать.

В единообразном коде, хранящемся в системе контроля версий, изменяемом централизованно и единообразно для всех таблиц? Скорее в вашей затее черт ногу сломит.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782730
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаНу так что, знает кто причину почему тормозит выборка с псевдотаблиц?:)

Начиная с 2005, для получения данных из псевдо таблиц используется версионное хранилище в tempdb. Она у Вас не может являться узким местом?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782733
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда включаем репликацию на сервере (publisher), она сама вешает на все таблицы триггеры.
И создает спец. таблицы в которых накапливает не отреплецированные данные.
Чем не хорошая заготовка для системы логирования ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782737
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEЧем не хорошая заготовка для системы логирования ?

Там нет данных о том, кто проводил модификацию?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782742
iapАцкийСкотонаТак чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы.Странное утверждение.
Главное, что надо сделать - забыть об универсальности.
И заниматься логгированием каждой таблицы в отдельности.
Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой
с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе.

Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ
можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!).
Да что там! Это логгирование можно оформить как отдельный триггер,
а бизнес-логика пусть будет в другом! Триггеров же может быть много!
Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом.

Главное, что надо сделать - забыть об универсальности.
Увы, не могу без нее спать. :)

И заниматься логированием каждой таблицы в отдельности.
Сейчас итак так сделано. В каждом(необходимом) триггере в конце код логирования. И если схему логирвоания изменить, то мне придется помирать на применении новой идеи из-за 1000+ таблиц в базе.

Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой
с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе.

Шо я собственно и делаю путем SELECT * INTO #T_INSERTED FROM INSERTED

Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ
можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!).

1. Повторяю еще раз. В триггере помимо кода логирования еще есть код, который не сгенерить.
2. Отдельных триггеров использовать возможности нет. Фист и ласт атрибуты заюзаны.
3. Скорость еще как тут важна, уж поверьте. :)
4. Код триггера должен в проекте быть, да бы иметь возможность рефакторинга.

Да что там! Это логгирование можно оформить как отдельный триггер,
а бизнес-логика пусть будет в другом! Триггеров же может быть много!

1. Можно, но должно оно быть в определенном. :)
2. Когда их много очережность выполнения гарантируется только для First- и Last- триггера. Такое не катит мне. :)

Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом.
Логирующий код я итак могу сформировать в зависимости от таблицы и того, какие поля в ней изменены. Притом сделать это на лету. :)
К тому же, чтото никто не вспомнил тут про то, что АДО при апдейте апдейтит ВСЕ записи. :) Поэтому код триггера еще должен исключать неизмененные поля в записях да бы снизить жирность логов.

Вот думаете если бы всё просто можно было просто сделать как говорите я бы не сделал что ли. :) Я заморачиваюсь не просто так, а надо ибо.
Советы про то как логировать мне наверно не нужны. Я уже сам знаю как всё организовать. Мне только надо понять почему дико тормозит вборка из псевдотаблиц. Хоят в конечном итоге я на нее могу забить. Расчет у меня всеравно по нескольку часов идет. Что мне эти несчтастные 45-145 секунд. :)

Итак, для вновь прибывших. :)
Меня интересует именно торможение при выборке из псевдотаблиц. Как логировать я уже сориентировался. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782750
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаМеня интересует именно торможение при выборке из псевдотаблиц
Торможение - это бонус вашей универсальности.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782765
pkarklinАцкийСкотона,
Scan count 566 - очень много. Интересно, какой результат будет, если вы уберете триггер и воспользуетесь кляузой OUTPUT в UPDATE?
Это еще мало. Аутпут мне бесполезен по идее. Но как он проходит сейчас поосмтрю.


tarrusАцкийСкотонапропущено...
Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать.
В единообразном коде, хранящемся в системе контроля версий, изменяемом централизованно и единообразно для всех таблиц? Скорее в вашей затее черт ногу сломит.
Попробуйте сначала хотя бы номрально представить себе код, который генерит триггеры, хранящийся в системе контроля версий. :) Потом представьте что у вас изменилось 100-300 таблиц. Потом еще некоторые талбицы объеденились, некоторые разъеденились в новые. И заетм представьте себе как вы будете свой ацкий гениальный генерирующий триггеры код рефакторить. Обязательно мне сообщите сколько времени у вас ушло с сколько ведер слюны вы наплевали.


ART-CODEКогда включаем репликацию на сервере (publisher), она сама вешает на все таблицы триггеры.
И создает спец. таблицы в которых накапливает не отреплецированные данные.
Чем не хорошая заготовка для системы логирования ?
Реплика- страшный сон. Вообще про нее не говорите мне пожалуйста. Намного правильнее заюзать технологии "Change tracking" или "Change Data Capture". Но увы и ах! На БД с "Memory optimized tables" данные технологии включить невозможно. Очередной дикополезнобесполезный функционал от мелкософта(эт я про MET).


pkarklinАцкийСкотонаНу так что, знает кто причину почему тормозит выборка с псевдотаблиц?:)
Начиная с 2005, для получения данных из псевдо таблиц используется версионное хранилище в tempdb. Она у Вас не может являться узким местом?
Честно сказать не понял. Можно поподробней про этом момент? Там насоклько знаю никакой версионности. Псевдотаблички на самом деле есть одна таблица, содержащая инсертед и делетед записи. Доступ через которые осуществляется через INSERTED\DELETED.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782768
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АДО при апдейте апдейтит ВСЕ записи

Если я пишу
Код: sql
1.
update sometable set somefield='1' where somrfiled='2'


то обновятся все записи ?
Никогда не встречался с таким поведением. В какой версии (mdac, sqlncli) такое ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782772
GloryАцкийСкотонаМеня интересует именно торможение при выборке из псевдотаблиц
Торможение - это бонус вашей универсальности.

Вообще то, чтобы изрекать тут что либо не по теме, прочитали бы сначала. Ну если вы не поняли, то объясню. Торможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере. Я уж не стал сразу гвоорить. Думал итак понятно будет. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782773
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Все" - в смысле, не только удовлетворяющие условию WHERE ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782776
ART-CODEАДО при апдейте апдейтит ВСЕ записи

Если я пишу
Код: sql
1.
update sometable set somefield='1' where somrfiled='2'


то обновятся все записи ?
Никогда не встречался с таким поведением. В какой версии (mdac, sqlncli) такое ?

Я хз в какой. Я разработкой интерфейса к нашей бд не занимаюсь. Просто мне сказали что так и происходит. Я бы конечно выловил запрос щас с клиента, да лень чота. Да и к теме не относится. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782777
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТорможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере.
Ну это же ваш выбор. Вы привели столько доводов в ответ на все возражения. И столько раз уверяли, что знаете, что делаете.
Что выбрали - то и получили.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782779
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаАДО при апдейте апдейтит ВСЕ записи. :)Да неужели?!
К тому же, что мешает выполнять свой явный UPDATE?

Что касается логгирования только записей с изменениями,
то этому здесь посвещено столько постов, что как же Вы их не увидели-то?
Я и сам пару десятков раз участвовал...

Да! О порядке вызовов триггеров.
Если есть зависимость от порядка их вызова, то это уже плохой признак.
Но какая, чёрт возьми, разница, в каком по порядку будет выполняться логгирование?!
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782784
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона
без тригера 2 сек, с триггером 5 сек, 500к записей 27 полей.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782790
tarrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона
tarrusпропущено...

В единообразном коде, хранящемся в системе контроля версий, изменяемом централизованно и единообразно для всех таблиц? Скорее в вашей затее черт ногу сломит.
Попробуйте сначала хотя бы номрально представить себе код, который генерит триггеры, хранящийся в системе контроля версий. :) Потом представьте что у вас изменилось 100-300 таблиц. Потом еще некоторые талбицы объеденились, некоторые разъеденились в новые. И заетм представьте себе как вы будете свой ацкий гениальный генерирующий триггеры код рефакторить. Обязательно мне сообщите сколько времени у вас ушло с сколько ведер слюны вы наплевали.



Я уже давно для всех БД использую SQL Server Database Project и кодо-генерацию. Если вы не знаете как организовать процесс разработки, то открывайте новую тему. Думаю у многих есть чем поделится в этом направлении.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782794
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хз в какой.
Могу предположить, что речь идет не о вызове нормального, корректного SQL скрипта или процедуры,
а о подключении компонентов типа ADOTable, и его методах.

Тогда да, нужно исправлять интерфейс.
Это совсем не дело в триггерах искать измененные данные.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782796
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаЧестно сказать не понял. Можно поподробней про этом момент? Там насоклько знаю никакой версионности. Псевдотаблички на самом деле есть одна таблица, содержащая инсертед и делетед записи. Доступ через которые осуществляется через INSERTED\DELETED.

Capacity Planning for tempdb

Version Stores
A version store is a collection of data pages that hold the data rows that are required to support the features that use row versioning. There are two version stores: a common version store and an online-index-build version store. The version stores contain the following:
Row versions that are generated by data modification transactions in a database that uses snapshot or read committed using row versioning isolation levels.

Row versions that are generated by data modification transactions for features such as: online index operations, Multiple Active Result Sets (MARS), and AFTER triggers.

The inserted and deleted tables that are used in AFTER triggers are created in tempdb. That is, the rows that are updated or deleted by the trigger are versioned. This includes all of the rows that are modified by the statement that fired the trigger. Rows that are inserted by the trigger are not versioned.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782800
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEЭто совсем не дело в триггерах искать измененные данные.Это почему же?
Давно и успешно ищу именно в триггерах.
Независимо от всяких там клиентов, как и положено.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782804
Ох вы а, да чот заладили выбрал да выбрал. Ну архитектура такая. Ну вот предназначен триггер для выполнения каких то действий, используются при этом инсертед\делетед. Ну не я же придумал скуль а. :)

GloryАцкийСкотонаТорможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере.
Ну это же ваш выбор. Вы привели столько доводов в ответ на все возражения. И столько раз уверяли, что знаете, что делаете.
Что выбрали - то и получили.
Это не мой выбор. Это так задумано вообще. Есть таблицы. На них триггера. Люди с таблицами работают. Триггера срабатывают. Чтото там делают... Сэ ля ви же. Я то причом тут?:)


iapАцкийСкотонаАДО при апдейте апдейтит ВСЕ записи. :)Да неужели?!
К тому же, что мешает выполнять свой явный UPDATE?

Что касается логгирования только записей с изменениями,
то этому здесь посвещено столько постов, что как же Вы их не увидели-то?
Я и сам пару десятков раз участвовал...

Да! О порядке вызовов триггеров.
Если есть зависимость от порядка их вызова, то это уже плохой признак.
Но какая, чёрт возьми, разница, в каком по порядку будет выполняться логгирование?!


К тому же, что мешает выполнять свой явный UPDATE?
В клиенте? Вы работали сишарпом к бд хоть раз? Мне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи. Что бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще. Не вдавался в подробности вобщем.


Что касается логгирования только записей с изменениями,
то этому здесь посвещено столько постов, что как же Вы их не увидели-то?
Я и сам пару десятков раз участвовал...

Да блин. Да не надо мне помощи в логировании. У меня есть отличный механизм. Мне только надо разобраться почему выборка с псевдотаблиц тормозит так. Сколько раз повторить еще?:)


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


Я и сам пару десятков раз участвовал...
Прошу прощенья за нескромный вопрос. А хоть раз реально помогли вопрошающим? Или как и мне только и говорите что я везде неправ? ;)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782808
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаЭто не мой выбор.
А кто тут распинался про универсальный триггер ?

АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи.
По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать

АцкийСкотонаЧто бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще.
У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782813
Владислав КолосовАцкийСкотона
без тригера 2 сек, с триггером 5 сек, 500к записей 27 полей.
А вот это уже конструктивно. Круто! А что именно в триггере выполняется? Так же как и у меня селект из инсертеда?
Апдейтите все записи в таблице? Поля варчаровские есть кстатьи, гуиды? И у меня 68 полей.


[/quot]
Я уже давно для всех БД использую SQL Server Database Project и кодо-генерацию. Если вы не знаете как организовать процесс разработки, то открывайте новую тему. Думаю у многих есть чем поделится в этом направлении.[/quot]
Спасибо, но думаю в билинге мне кодогенерация не нужна. У нас четкая бизнес-логика. Потребностей в генерации чего-то там особо нет. :)


ART-CODEЯ хз в какой.
Могу предположить, что речь идет не о вызове нормального, корректного SQL скрипта или процедуры,
а о подключении компонентов типа ADOTable, и его методах.

Тогда да, нужно исправлять интерфейс.
Это совсем не дело в триггерах искать измененные данные.
Ф точку! Но пока мне придется разбираться с этим на уровне БД. Ничего страшного С этим будет разбираться CLRка в отдельных потока. Переживу. :)


2pkarklin , если вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782815
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
Прошу прощения, небольшая путаница произошла - кто о чем говорил. Вы правы.

Тут автор уточнил:ВСЕ поля в бд для этой записи
Все, разобрались.
Код: sql
1.
IF UPDATE(somefield) BEGIN
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782820
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаесли вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :)
http://technet.microsoft.com/en-us/library/ms175527(v=sql.105).aspx
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782821
GloryАцкийСкотонаЭто не мой выбор.
А кто тут распинался про универсальный триггер ?

АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи.
По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать

АцкийСкотонаЧто бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще.
У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ?


А кто тут распинался про универсальный триггер ?
Я про логирование говорил. :)

По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать
Не стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок?

У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ?
Человек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!!
Кстатьи, у вас там в ТЗ не прописано как должна работать выборка с инсертед\делетед?:) А можно почитать?:)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782825
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона А кто тут распинался про универсальный триггер ?
Я про логирование говорил. :)
Фейспалм.

АцкийСкотонаНе стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок?
Ну разумеется.
Весь ваш код и способы просто шедевры программисткой мысли.
А дурацкий сервер не желает выполнять такой прекрасный код.

АцкийСкотонаЧеловек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!!
Я понял. ТЗ - нет.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782833
GloryАцкийСкотонаесли вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :)
http://technet.microsoft.com/en-us/library/ms175527(v=sql.105).aspx
Там только про авторазрастание. Давайте конкретнее. Ссылок буз объяснений я тоже могу накидать. :)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782834
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТам только про авторазрастание. Давайте конкретнее.
А вы это уже выполнили что ли ?

АцкийСкотонаДавайте конкретнее. Ссылок буз объяснений я тоже могу накидать.
Если вы ищите кнопку "Работай быстро", то ее не существует.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782848
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаShakillнасчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть.

Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать.
один шаблон логирования, разный набор полей. запуск генератора триггеров по необходимости - при изменении таблиц и когда собираетесь изменить логику логирования.
а в чем трудности поиска ошибок?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782853
GloryАцкийСкотона А кто тут распинался про универсальный триггер ?
Я про логирование говорил. :)
Фейспалм.

АцкийСкотонаНе стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок?
Ну разумеется.
Весь ваш код и способы просто шедевры программисткой мысли.
А дурацкий сервер не желает выполнять такой прекрасный код.

АцкийСкотонаЧеловек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!!
Я понял. ТЗ - нет.

Фейспалм.
Ну ладно. Не буду заставлять вас понимать чег оя именно хочу добиться.


Ну разумеется.
Весь ваш код и способы просто шедевры программисткой мысли.

Я не говорил этого. Я вообще в код клиента не лазаю. Не вижу щас причины что вы так на меня прёте. :)


А дурацкий сервер не желает выполнять такой прекрасный код.
Ну не само железо конечно. Но скуль по идее полон мест которые вроде как должны быть дико скоростны и удобны, но на самом деле настолько сыры, что никакого желания(и пользы) юзать нет. Вспомним хотя бы дикокласнцю идею про CLR-триггер, который не знает(и никак совершенно узнать не может) на какой же он таблице выполнился! :) Давайте не будем . :)
Мне от вас надо только решение проблемы с тормозами по выборки из псевдотаблиц. Остальное можно обсудить за рамками данной темы, если вам так интересно. :)



GloryАцкийСкотонаТам только про авторазрастание. Давайте конкретнее.
А вы это уже выполнили что ли ?

АцкийСкотонаДавайте конкретнее. Ссылок буз объяснений я тоже могу накидать.
Если вы ищите кнопку "Работай быстро", то ее не существует.

1. Что конкретно там выполнить надо? Вы нормально объясниете.
2. Да не ищу я. Я привык работать нормально, а не на отъ***сь. Поэтому и не делаю в каждом триггере кастомный говнокод лишь бы побыстрее задачу закрыть! В виду этого пришел к тому, что механизм логироания должен быть уиверсальным, насколько это возможно. Повторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки, чем потом при изменени модели логирования лопатить ВСЕ триггеры.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782858
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаПовторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки
Ну так запихните, что хотите.
Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782859
ShakillАцкийСкотонапропущено...


Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать.
один шаблон логирования, разный набор полей. запуск генератора триггеров по необходимости - при изменении таблиц и когда собираетесь изменить логику логирования.
а в чем трудности поиска ошибок?
Опять....
В триггере не только механизм логирования. Там еще есть действия над другими объектами БД, с приджойниванием псевдотаблиц.
Проблем с логирвоанием у меня НЕТ! :) У меня проблема с тормозами SELECT 1 FROM INSERTED. Прочтите тему с начала .если не понимаете об чем речь идет.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782861
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаУ меня проблема с тормозами SELECT 1 FROM INSERTED.
Ну так поставьте диски побыстрее, процессоры побстрее, памяти побольше, редакцию постарьше. Делайте что нибудь.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782863
GloryАцкийСкотонаПовторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки
Ну так запихните, что хотите.
Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ?

Повторяю еще раз.
Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782864
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаGloryпропущено...

Ну так запихните, что хотите.
Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ?

Повторяю еще раз.
Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.Не выбирайте из inserted, раз не устраивает. Выбирайте из временной таблицы. Что непонятного?

И да, версия сервера какая?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782868
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаПовторяю еще раз.
Если сто раз повторить "халва", то во рту слаще не станет

АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.
Повторяю еще раз (гы) - кнопки "Работай быстро" не существует.
Если "переливание" всех данных из временной таблицы во временную таблицу работает медленно, то нет программных средств ускорения.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782872
Гавриленко Сергей АлексеевичАцкийСкотонапропущено...


Повторяю еще раз.
Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.Не выбирайте из inserted, раз не устраивает. Выбирайте из временной таблицы. Что непонятного?

И да, версия сервера какая?

Для тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?
2014 скуль.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782875
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере.
О Боже !
В каком отдельном потоке вы собрались обрабатывать локальную временную таблицу ???
Вы хоть читали в хелпе хоть что нибудь про временные таблицы ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782876
GloryАцкийСкотонаПовторяю еще раз.
Если сто раз повторить "халва", то во рту слаще не станет

АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.
Повторяю еще раз (гы) - кнопки "Работай быстро" не существует.
Если "переливание" всех данных из временной таблицы во временную таблицу работает медленно, то нет программных средств ускорения.
Халва. :)


Так почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? У вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782878
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782879
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек?
Потому что это разные таблицы в разных базах. Сюрприз ???

АцкийСкотонаУ вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:)
Какая дискуссия может быть при отсутствии у вас знаний предметной области ?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782884
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? У вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:)
Потому что, для переливания из inserted, серверу ее предварительно приходиться создавать и заливать туда данные.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782887
GloryАцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере.
О Боже !
В каком отдельном потоке вы собрались обрабатывать локальную временную таблицу ???
Вы хоть читали в хелпе хоть что нибудь про временные таблицы ?
Так, не надо щас вот тут издыханий вашего ЧСВ а.
Всё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML оба буфера и отдается сервисброкером другому процессу. Другой процесс распарсит хмл, прочухает какие поля обновились, а какие нет. Сформирует результирующий ХМЛ. Создаст строки в таблице логов.
Вот. Заставили такие меня свою идею раскрыть. :)
Еще вопросы есть?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782892
Гавриленко Сергей АлексеевичАцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас.

На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782894
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?

В отдельном потоке обработать данные из локальной временной таблицы?! Чтоб "не задерживаться в триггере" есть Service Broker.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782895
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEВсе, разобрались.
Код: sql
1.
IF UPDATE(somefield) BEGIN

Срочно забудьте это навсегда!
Что, по-Вашему, делает функция UPDATE()?

Я не очень понял, в чём именно я был прав :))
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782901
GloryАцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек?
Потому что это разные таблицы в разных базах. Сюрприз ???

АцкийСкотонаУ вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:)
Какая дискуссия может быть при отсутствии у вас знаний предметной области ?
Молодец, орёл! Конечно же физическая таблица и ее инсертед\делетед В РАЗНЫХ БАЗАХ.
Ваша копметентность в плане программирования БД пошатнулась в моих глазах. Прошу больше чуши не нести. Если есть что сказать по теме- с радостью выслуашую. Дальше бред мне слушать не интерсно.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782902
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи.
Кто мешает не использовать датасет? Есть куча ORM, которые отслеживают изменения и пишут только их...
АцкийСкотонаДе вы видели ТЗ, которое диктует как работать фреймворкам?
Таких нет. Но если у программиста кривые руки, то, конечно, виноват фреймворк.
АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"
попробуйте переписать на insert into #T_INSERTED (перечислите явно столбцы) select перечислите явно столбцы from INSERTED
АцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?
Зря. К тому же для логирования можно Service Broker использовать.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782903
pkarklinАцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?

В отдельном потоке обработать данные из локальной временной таблицы?! Чтоб "не задерживаться в триггере" есть Service Broker.
Так я двумя постами выше же сказал что сервисброкером буду работать.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782904
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаГавриленко Сергей Алексеевичпропущено...
Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас.

На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут. Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782905
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаВсё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML
Еще вопросы есть?

Угу. Как Вы из CLR достучитесть до локальной временной таблицы? Даже если достучались, с чего Вы решили, что CLR будет работать асинхронно по отношению к триггеру? Почему прямо в триггере не сформировать XML (на такую большу таблицу при полном апдейте, правда он будет не хилый) и поставить сообщение в очередь SB?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782906
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаТак, не надо щас вот тут издыханий вашего ЧСВ а.
Всё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML оба буфера и отдается сервисброкером другому процессу. Другой процесс распарсит хмл, прочухает какие поля обновились, а какие нет. Сформирует результирующий ХМЛ. Создаст строки в таблице логов.
Вот. Заставили такие меня свою идею раскрыть. :)
Еще вопросы есть?
Двойной фейспалм.
Заставить сервер создать временную таблицу inserted.
Чтобы скопировать ее во другую временную таблицу.
Чтобы на ее основе создать xml.
Чтобы его передать куда-то.
Чтобы его потом распарсить.
Чтобы что-то определить.
Чтобы на основе этого создать еще один xml.
Который потом добавить в таблицу.

Это тянет на Нобелевку
Пойдука я лучше в другие темы.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782913
Гавриленко Сергей АлексеевичАцкийСкотонапропущено...


На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут.Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете.
Пардон муа.
Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED.
Итак. Поехали. У меня два таблицы.
1. Шапки документов.
2. Строки документов.

Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782920
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаГавриленко Сергей Алексеевичпропущено...
Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете.
Пардон муа.
Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED.
Итак. Поехали. У меня два таблицы.
1. Шапки документов.
2. Строки документов.

Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.Я вам по секрету скажу: это можно сделать без триггера быстро. Или с триггером долго. Выбирайте.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782921
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаПредоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED.
Итак. Поехали. У меня два таблицы.
1. Шапки документов.
2. Строки документов.

Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.

Гм... Триггер, не единственный способ (а м.б. и не самый лучший) реализации поставленной задачи.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782922
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаЯ поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATEDДля этого не нужен триггер (хотя вот у нас тоже в триггере сделано).

Индексированное представление вместо шапки!
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782930
Arm79АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи.
Кто мешает не использовать датасет? Есть куча ORM, которые отслеживают изменения и пишут только их...
АцкийСкотонаДе вы видели ТЗ, которое диктует как работать фреймворкам?
Таких нет. Но если у программиста кривые руки, то, конечно, виноват фреймворк.
АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"
попробуйте переписать на insert into #T_INSERTED (перечислите явно столбцы) select перечислите явно столбцы from INSERTED
АцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?
Зря. К тому же для логирования можно Service Broker использовать.

1. я не интерфейс программирую, бд. про поведение датапровайдеров мне сами интерфесчики рассказали когда натолкнулись на это.
2. руки непричом. интерфейс делали давно. логирование появилось позже.
3. да хоть SELECT 1 FROM INSERTED написать. всеравно 45-47 секунд.
4. Что именно зря? Зачем мне лопатить миллионы записей в лог именно во время их апдейта? Пару минут и подождать могут. Не лезут же пользаки после каждой операции в лог, смотреть что там где проапдейтилось. Да большство планктона вообще не подозревает об существовании логирования. Хотя на основании которого переодически по шапке получает за ковыряние в базе.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782932
Гавриленко Сергей АлексеевичАцкийСкотонапропущено...

Пардон муа.
Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED.
Итак. Поехали. У меня два таблицы.
1. Шапки документов.
2. Строки документов.

Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.Я вам по секрету скажу: это можно сделать без триггера быстро. Или с триггером долго. Выбирайте.

Так я ж жду, говорите.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782938
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
UPDATE()
Есть, конечно, свои минусы.возвращает TRUE независимо от того, была ли попытка применить операторы INSERT или UPDATE удачной. Давно сам ее не использовал (лет 7 уже), потому забыл.

Ну, можно просто сравнивать старое и новое значение.
Возможно, COLUMNS_UPDATED есть.

не очень понял, в чём именно я был прав
Да, можно искать измененные данные, если они были изменены специально, осмысленно,
а не вся таблица скопом перезаписывается и ищи в этой каше - какая же строка на самом деле обновилась.
Изначально было сказано, что обновляются ВСЕ ЗАПИСИ.
И лишь потом пришло уточнение что не все записи а все поля.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782939
iapАцкийСкотонаЯ поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATEDДля этого не нужен триггер (хотя вот у нас тоже в триггере сделано).

Индексированное представление вместо шапки!

Не прокатит. У строк должны быть ссылки на сущность их содержащую. Таблиц в базе не ДВЕ. А сотни. Многие взаимодействуют со многими.

Вообще реализация БД это не тема данной беседы. Архитектура релизована так как реализована. Насколько мне изместно конкурентов у нас по этой тебе адекватных нет. Давайте больше реализацию БД обсуждать не будем.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782946
ART-CODEiap,
UPDATE()
Есть, конечно, свои минусы.возвращает TRUE независимо от того, была ли попытка применить операторы INSERT или UPDATE удачной. Давно сам ее не использовал (лет 7 уже), потому забыл.

Ну, можно просто сравнивать старое и новое значение.
Возможно, COLUMNS_UPDATED есть.

не очень понял, в чём именно я был прав
Да, можно искать измененные данные, если они были изменены специально, осмысленно,
а не вся таблица скопом перезаписывается и ищи в этой каше - какая же строка на самом деле обновилась.
Изначально было сказано, что обновляются ВСЕ ЗАПИСИ.
И лишь потом пришло уточнение что не все записи а все поля.

И лишь потом пришло уточнение что не все записи а все поля.
БЛ базы обновляет конкретные. Это клиентская часть в некоторых реализациях апдейтит все поля строки БД, которые были в датасете.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782984
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаВообще реализация БД это не тема данной беседы. Архитектура релизована так как реализована. Насколько мне изместно конкурентов у нас по этой тебе адекватных нет. Давайте больше реализацию БД обсуждать не будем.
Если так, то нужна конкретика.

Вот я попытался воспроизвести проблему, у меня не получилось такой задержки (правда я на 2014 ctp1 проверял, нет на работе 2014rtm).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
set nocount on;
use master;
go
if db_id('d') is not null drop database d;
go
create database [d];
go
use [d];
go
create table t(
	[01] varchar(50),[02] varchar(50),[03] varchar(50),[04] varchar(50),[05] varchar(50),[06] varchar(50),[07] varchar(50),[08] varchar(50),[09] varchar(50),[10] varchar(50),
	[11] varchar(50),[12] varchar(50),[13] varchar(50),[14] varchar(50),[15] varchar(50),[16] varchar(50),[17] varchar(50),[18] varchar(50),[19] varchar(50),[20] varchar(50),
	[21] varchar(50),[22] varchar(50),[23] varchar(50),[24] varchar(50),[25] varchar(50),[26] varchar(50),[27] varchar(50),[28] varchar(50),[29] varchar(50),[30] varchar(50),
	[31] varchar(50),[32] varchar(50),[33] varchar(50),[34] varchar(50),[35] varchar(50),[36] varchar(50),[37] varchar(50),[38] varchar(50),[39] varchar(50),[40] varchar(50),
	[41] varchar(50),[42] varchar(50),[43] varchar(50),[44] varchar(50),[45] varchar(50),[46] varchar(50),[47] varchar(50),[48] varchar(50),[49] varchar(50),[50] varchar(50),
	[51] varchar(50),[52] varchar(50),[53] varchar(50),[54] varchar(50),[55] varchar(50),[56] varchar(50),[57] varchar(50),[58] varchar(50),[59] varchar(50),[60] varchar(50),
	[61] varchar(50),[62] varchar(50),[63] varchar(50),[64] varchar(50),[65] varchar(50),[66] varchar(50),[67] varchar(50),[68] varchar(50),[69] varchar(50),[70] varchar(50)
);

declare @i int = 0;
declare @sql nvarchar(max) = N'insert t select replicate(''a'',abs(checksum(newid())%50))';
while @i < 69 begin
	set @sql+=N',replicate(''a'',abs(checksum(newid())%50))'
	set @i+=1;
end
set @i = 0;
while @i < 350000 begin	
	exec sp_executesql @sql;
	set @i+=1;
end;
go
alter trigger tr_t_u on t for update
as
select getdate();
select a = 1 into #inserted from inserted;
select getdate();
select a = 1 into #t from t;
select getdate();
go

update t set [01] = replicate('a',abs(checksum(newid())%50));


Случай, что вторая выборка в первый раз идет ощутимо быстрее, примерно 45 секунд против 5 секунд (на моей машине), за счет того, что в первый раз данные поднимаются в кэш, второй раз быстро, и могут вымываться между тестами - мы ведь исключаем? т.е. проблема у вас воспроизводится постоянно и не зависит от того в каком порядке идут в тестовом триггере выборка из inserted и таблицы?

Соответственно, если хотите конкретики - модифицируйте скрипт так, чтобы проблема воспроизвелась, либо предоставьте свой.

Если это проблема воспроизводится только у вас, из-за вашей конфигурации оборудования/настроек/магнитных полей, то необходимо предоставить информацию по ожиданиям. Вы писали:
авторНикаких. Нулл в типе ожидания.
Может вы не правильно смотрели, или не в тот момент? Попробуйте собрать ожидания при помощи события sqlos.wait_info

Короче, чтобы адресовать вашу проблему предметно нужно либо иметь репро, либо иметь какие-то данные того, что происходит на сервере.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38782991
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEВозможно, COLUMNS_UPDATED естьТо же самое.
Смысл имеет лишь сравнение соответствующих записей deleted и inserted.
Если записей более одной, то это возможно только при наличии полей,
однозначно связывающих deleted и inserted и неизменившихся в результате данного UPDATE.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783012
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

триггер такой:
Код: sql
1.
2.
3.
create trigger tr1t on temp.cust for update
as
select getutcdate() dd,* into #inserted from inserted 



Таблица:
int no 4
varchar no 200
int no 4
int no 4
varchar no 80
varchar no 80
varchar no 12
varchar no 12
varchar no 250
varchar no 60
varchar no 60
varchar no 60
varchar no 50
varchar no 15
date no 3
varchar no 120
date no 3
varchar no 120
varchar no 20
varchar no 20
varchar no 60
varchar no 60
varchar no 60
varchar no 15
varchar no 120
smallint no 2
tinyint no 1

подозреваю, что производительности Вашей tempdb маловато для таких операций.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783033
SomewhereSomehow, На сервере ничего не происходит. По крайней мере в момент моей активности.

Смотрел посредством скрипта.

SELECT
s.login_name, r.status, d.name as DB_Name, /*o.schema_id*/sch.name, o.name AS ObjName,
substring(qt.text,(r.statement_start_offset/2) +1,
(CASE WHEN r.statement_end_offset = -1 THEN len(CONVERT(nvarchar(MAX), qt.text)) * 2 ELSE r.statement_end_offset END -r.statement_start_offset)/2)
AS stmt_executing,
r.session_id, r.blocking_session_id, r.wait_type, r.wait_time, r.wait_resource, r.row_count,
r.reads AS P_reads, r.logical_reads as L_Reads, r.writes, r.total_elapsed_time, r.estimated_completion_time, r.percent_complete
-- MISC
, d.database_id
FROM sys.dm_exec_requests r
INNER JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
INNER JOIN sys.databases d
on r.database_id = d.database_id
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt
LEFT JOIN sys.objects o
ON /*d.database_id = o.
AND*/ qt.objectid = o.object_id
INNER JOIN sys.schemas sch
ON o.schema_id = sch.schema_id

WHERE r.session_id <> @@SPID
AND ISNULL(r.wait_type, '') <> 'TRACEWRITE'
ORDER BY
d.name ASC, s.session_id ASC, r.wait_resource DESC


Я не знаю как у вас отрабатывает быстрее. А сколько конкретно первый и второй стейтмент по времени идут?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783041
Владислав Колосов,
Ну у меня полей поболее. Сколько ваш запрос занимает? Сделайте еще селект инто с физической таблицки на которой триггре висит. У вас есть такая же разительная разница как у меня?
Кста, основныей файлы БД и темпдб на одном диске?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783089
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783103
Владислав КолосовАцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось.

а можете во так у себя попробовать?
select getutcdate()
select * into #inserted from inserted
select getutcdate()
select * into #inserted2 from temp.cust
select getutcdate()

Какие результаты в секундах у первого и второго?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783111
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

Быстрее только в первый раз, в дальнейшем ситуация как у вас не воспроизвелась. У вас же, как я понял, ситуация воспроизводится стабильно. Ок, вы не видите активности на сервере, но посмотрите при помощи расширенного события, чего ждет запрос?
Планы что-нибудь показывают? Например, при сканировании обычной таблицы параллельный скан , при сканировании inserted нет.

Но у меня такая разница как у вас не воспроизводится, впрочем я ничего не знаю ни о ваших данных, ни об условиях, ни о способе измерения. Как я уже говорил, либо репро, либо какая-то конкретика, чего так долго ждет запрос. А то получается, что у вас медленно, воспроизвести в простом случае это нельзя, а больше никаких данных вы не даете. Гадать можно долго, хотя, может рано или поздно кто-то угадает, но я это делать не берусь.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783123
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаВладислав КолосовАцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось.

а можете во так у себя попробовать?
select getutcdate()
select * into #inserted from inserted
select getutcdate()
select * into #inserted2 from temp.cust
select getutcdate()

Какие результаты в секундах у первого и второго?

Просто во временную таблицу - секунда, из inserted - около 5 секунд.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783124
SomewhereSomehow, Ну у меня такие же планы ка у вас. Один в один наверно даже по цифрам. Тоже вся стоимость в скане инсертеда. А какие мне вам данные еще дать? Сами данные не могу, пардон, они закрытые. :)
Могу структуру таблички дать завтра. Щас сваливаю. Резину менять надо. Страшно а то по снегу на грязевой катать. :D
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783127
Владислав Колосов, а сколько строк в таблице? И какова примерная плотность заполнения полей?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783141
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона, в триггере 98% времени выполнения занимает вставку во временную таблицу, 2% скан inserted.
Тем не менее, вставка в триггере выполняется намного медленнее.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783142
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаА какие мне вам данные еще дать?

Репро, т.е. такой скрипт, запустив который у участников форума воспроизвелось бы описываемое поведение. Да, это муторно, нужно делать скрипты тестовых таблиц, заполнять их какими-то псевдо данными и т.д., но это лучший способ получить предметный ответ. Если репро не получается сделать, то хотя бы ожидания (в третий раз по-моему повторяю) при выполнении вашего запроса на вашем сервере.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783146
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
500000 строк, я же писал. Размер - 77 мб.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783227
Владислав КолосовАцкийСкотона, в триггере 98% времени выполнения занимает вставку во временную таблицу, 2% скан inserted.
Тем не менее, вставка в триггере выполняется намного медленнее.
А ничего не путаете? У меня и у SomewhereSomehow 98% именно скан инсерта, а не вставка во временную таблицу. Вот попробуйте просто селект 1 из инсертеда сделать. Ради интереса.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783232
Владислав Колосов500000 строк, я же писал. Размер - 77 мб.
У меня триста тыщ 308 метров весят. Судя по плану. План свой показать для обоих запросов можете, если не затруднит?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783245
SomewhereSomehowАцкийСкотонаА какие мне вам данные еще дать?

Репро, т.е. такой скрипт, запустив который у участников форума воспроизвелось бы описываемое поведение. Да, это муторно, нужно делать скрипты тестовых таблиц, заполнять их какими-то псевдо данными и т.д., но это лучший способ получить предметный ответ. Если репро не получается сделать, то хотя бы ожидания (в третий раз по-моему повторяю) при выполнении вашего запроса на вашем сервере.
Проблематично мне такой скрипт написать.
А насчёт ожиданий, так я же писал. Там промелькивает цхпакет , асинхрон Ио, но они не висят при запросе. Просто может совпало так. Я их не каждый раз вижу. Завтра хочу посмотреть план реалтайм прямо, который в момент выполнения юзать.
Может что-то в настройках инстанса? Есть идеи?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783311
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаМожет что-то в настройках инстанса? Есть идеи?Тут обсуждение превратилось в какое то препирательство по общесиквельной тематике.

Привнесите конкретику.
Выложите результат трейса (с заходом внутрь), в виде файла трейса, для вариантов с
SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED
и
SELECT "ПОЛЕ" INTO #T_INSERTED FROM "Таблица_на_которой_стоит_триггер"

Можно даже это сделать в одном триггере, поменяв, естественно, имя временной таблицы для второго инсёрта.

А то у вас из фактов - какие то тексты сообщений со статистикой (естественно, без названий стейтментов), по которым вы делаете какие то предположения. Реально же вы не знаете, что у вас там "тормозит".
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783359
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаА насчёт ожиданий, так я же писал. Там промелькивает цхпакет , асинхрон Ио, но они не висят при запросе. Просто может совпало так. Я их не каждый раз вижу.

16737238 :
SomewhereSomehowПопробуйте собрать ожидания при помощи события sqlos.wait_info
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783495
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параллелизм при одновременной вставке во временную таблицу. Похоже, типа.

Вообще какой-то странный лог для операции массового апдейта.

Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783621
SIMPLicity_Параллелизм при одновременной вставке во временную таблицу. Похоже, типа.

Вообще какой-то странный лог для операции массового апдейта.

Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится
Тему прочитайте. Прежде чем выводы делать. Я неоднократно говорил что именно тормозит. Не вставка отнюдь.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783628
alexeyvg, Какой вам еще трейс надо? В каком виде? Общепринятый стандарт форума есть? Если есть прошу указать.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783635
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаalexeyvg, Какой вам еще трейс надо? В каком виде? Общепринятый стандарт форума есть? Если есть прошу указать.В профайлере нажимаете кнопочку Save, трейс сохраняется. Сохранённый файл прикладываете к посту в форуме.

При иследовании проблем производительности всегда используют профайлер, по крайней мере, если речь не об отладке одиночного запроса (да и в этом случае непонятно, зачем от него отказываться).

Для вашей задачи выберите следующие настройки профайлера, обратите внимание на набор Events и установите SPID из того окошка, откуда запускаете обновление таблицы:
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783752
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаSIMPLicity_ Параллелизм при одновременной вставке во временную таблицу. Похоже, типа.

Вообще какой-то странный лог для операции массового апдейта.

Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится
Тему прочитайте. Прежде чем выводы делать. Я неоднократно говорил что именно тормозит. Не вставка отнюдь.
Прошу прощения, есличо. Ориентировался исключительно на ТЕМУ. Топег дальше второй страницы не читал,- он там, похоже ( как тут принято ), сваливается в говно. Про "тормоза" - просто поделился опытом: было нечто похожее,- переписал - заработало шустро.

Удачи, типа!
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38783839
SIMPLicity_, Если бы прочитали "дальше второй страницы", то увидели бы что тормозит не вставка во временную таблицу, а сам выбор из инсертеда.
Удачи Вам в дальнейшем с таким "подходом" к вопросам!

alexeyvg, Я для этих целей, дэбага, конечно несколько другие методы использую. Но понимаю что вам надо некоторые данные с трейса. Сейчас раскидаю таски и сделаю вам трейс в запрошенном виде. Ориентировочно- после обеда.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38784048
alexeyvg, Вот трейс. Но ничего полезного для решения проблемы там нет.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38784835
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаalexeyvg, Вот трейс. Но ничего полезного для решения проблемы там нет.А что с памятью в момент выполнения? PLE?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38784866
Mind, Памяти вагон. Еще идеи?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38784889
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаЕще идеи?
Да идей-то может быть тоже вагон и маленькая тележка, но кому интересно играть в эту угадайку.

16737238
авторПопробуйте собрать ожидания при помощи события sqlos.wait_info
16737828
авторно посмотрите при помощи расширенного события, чего ждет запрос?
16737989
авторЕсли репро не получается сделать, то хотя бы ожидания
16739168
авторПопробуйте собрать ожидания при помощи события sqlos.wait_info

И репро делать не хотите.
Только удачи можно пожелать, ибо надежда на нее.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38784892
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотонаКонкретнее. Имеем два стейтмента.

1. SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED
и
2. SELECT "ПОЛЕ" INTO #T_INSERTED FROM "Таблица_на_которой_стоит_триггер"

В таблице 350000 записей. Проводится апдейт всех записей по некому полю, думаю не важно по какому.
Результат: 45сек и 0,5 сек. Притом результат один и тотже что выбирать ВСЕ столбцы, что один какой либо. Даже если написать


Патамушто
2. есть документированный BULK (т.е. минимально логгируемая операция),
а 1. никогда такой не будет. Патамушто в транзакции.

ЗЫ. Ну а в остальном - присоединимся с предыдущим ораторам: херней маетесь.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38785033
aleks2,

без стрельбы в воздух пожалуйста. оба стейтмента внутри триггера. оба выполняются под транзакцией. бесполезные коменты прошу оставить при себе.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38785035
SomewhereSomehow, чтобы выполнить тот скрипт необходимо создавать евент. на его создание необходимы права, которые мне не дали.
Чем вас не устраивает скрипт, который я прилагал ранее? Он и ожидания и ресурсы показывает.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38785179
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АцкийСкотона,

Тем, что показывает текущее ожидание и зависит от момента запуска. Сбор событий позволяет получить полную картину.
Пусть соберет тот, у кого есть права, раз не хочет вам давать. Хотя странна такая избирательность, на профайлер есть, а тут закрыли?

Еще можете попробовать, раз у вас 2014 сервер, выполнить запрос в режиме set statistics xml on, и через некоторое время, пока он выполняется, сделать в другом окне запрос к представлению - sys.dm_exec_query_profiles - посмотрите кто дольше всех выполняется и что происходит.

Сам апдейт с триггером, если закомментировать обращение к таблице inserted, сколько выполняется?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38786131
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Патамушто
2. есть документированный BULK (т.е. минимально логгируемая операция),
а 1. никогда такой не будет. Патамушто в транзакции.Дело не в этом.
Вот есть 2 операции, обе в транзакции:
Код: sql
1.
2.
SELECT F_Division, LINK INTO #T_INSERTED FROM INSERTED OPTION(MAXDOP 128)
SELECT * INTO #T_INSERTED2 FROM PE.FD_Charge_Details


Вообще загадка, интересно, я даже установил себе 2014, чтобы трейс прочитать :-)

Запись там жалких 500 страниц для первого стейтмента и 1000 для второго (в первой 2 поля (16 байт), во второй *(942 байт) ).
BULK или нет, неважно, операция мизерная.

А вот чтений страниц: 194149595 для первого, и 28239 для второго. Почему??? Чего там читать, 1.6 террабайта для мизерных 300 тысяч нешироких строк???

Отличие в планах в операторе Distribute Streams...

2 АцкийСкотона
Не могли бы вы сделать ещё один трейс, сделав стейтменты по возможности одинаковыми, исключив паралелизм?
Код: sql
1.
2.
SELECT F_Division, LINK INTO #T_INSERTED FROM INSERTED OPTION(MAXDOP 1)
SELECT * INTO #T_INSERTED2 FROM PE.FD_Charge_Details OPTION(MAXDOP 1)
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38786146
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehowЕще можете попробовать, раз у вас 2014 сервер, выполнить запрос в режиме set statistics xml on, и через некоторое время, пока он выполняется, сделать в другом окне запрос к представлению - sys.dm_exec_query_profiles - посмотрите кто дольше всех выполняется и что происходит.Да в трейсе всё видно...
SomewhereSomehowСам апдейт с триггером, если закомментировать обращение к таблице inserted, сколько выполняется?71 секунда всего, из них
45 на FROM INSERTED
5 на FROM PE.FD_Charge_Details
10 на отладочный вывод, не имееющий отношения к обсуждению
1 секунда на сбор статистики
Остаётся 9 секунд на сам апдэйт
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38786149
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehowНо у меня такая разница как у вас не воспроизводится, впрочем я ничего не знаю ни о ваших данных, ни об условиях, ни о способе измерения. Как я уже говорил, либо репро, либо какая-то конкретика, чего так долго ждет запрос.А сколько у вас чтений для первого и второго запроса, и сколько время выполнения?
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38786343
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Я тоже смотрел трейс и видел большое число необъяснимых чтений. Именно по этому, я попросил автора посмотреть, что твориться в dm_exec_query_profiles.

Сделал небольшое репро, там тоже есть чтения, которые непонятно откуда берутся:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
set nocount on;
use master;
go
if db_id('d') is not null drop database d;
go
create database [d];
go
use [d];
go
create table t([01] int, [02] int, [03] int, [04] char(500) not null default(''));

with c as (
	select top(350000) rn = row_number() over(order by(select null)) from master..spt_values v1,master..spt_values v2,master..spt_values v3
)
insert t([01],[02],[03]) select rn, rn, rn from c;
go
create table t_fk1([01] int primary key, f char(100) not null default(''));
create table t_fk2([02] int primary key, f char(100) not null default(''));
create table t_fk3([03] int primary key, f char(100) not null default(''));
go
insert t_fk1([01]) select [01] from t;
insert t_fk2([02]) select [02] from t;
insert t_fk3([03]) select [03] from t;
go
alter table t with check add constraint fk_01 foreign key ([01]) references t_fk1([01]);
alter table t with check add constraint fk_02 foreign key ([02]) references t_fk2([02]);
alter table t with check add constraint fk_03 foreign key ([03]) references t_fk3([03]);
go
--drop table t_fk1, t_fk2, t_fk3;

create trigger tr_t_u on t for update
as
select getdate();
select a = 1 into #inserted from inserted;
select getdate();
select a = 1 into #t from t;
select getdate();


Запускаем вместе с профайлером:
Код: sql
1.
2.
3.
4.
select @@spid
set statistics io, time, xml on
update t set [01] = [01], [02] = [02], [03] = [03];
set statistics io, time, xml off




Далее, быстренько в другом окне смотрим что в sys.dm_exec_query_profiles,
т.к. у меня слишком быстро выпоняется триггер, я в цикле собираю сведения, ТС-у можно этого не делеать.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set nocount on;
select top(0) * from sys.dm_exec_query_profiles;
alter table #prof add i int;

truncate table #prof
declare @i int = 0;
while 1=1 begin

	insert #prof select *, @i from sys.dm_exec_query_profiles with(nolock)
	set @i += 1;
end


Теперь, смотрю, что получилось в sys.dm_exec_query_profiles:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from
(
select top(1) with ties 
	*
from 
	#prof 
where 
	plan_handle = 0x05001100072CFD1BB049B87F0200000001000000000000000000000000000000000000000000000000000000 --тут нужно подставить план хендл триггера
order by 
	i desc
) t
order by
	thread_id,
	node_id


Для таблицы выдает:
physical_operator_name node_id thread_id logical_read_countParallelism 0 0 NULLTable Insert 1 0 0Table Scan 3 0 0Table Insert 1 1 0Table Scan 3 1 6976Table Insert 1 2 0Table Scan 3 2 2688Table Insert 1 3 0Table Scan 3 3 8166Table Insert 1 4 0Table Scan 3 4 5504
По сумме чтений примерно совпадает с профайлером.

Для inserted:
physical_operator_name node_id thread_id logical_read_countParallelism 0 0 NULLTable Insert 1 0 0Parallelism 3 0 NULLInserted Scan 4 0 0Table Insert 1 1 0Parallelism 3 1 NULLInserted Scan 4 1 0Table Insert 1 2 0Parallelism 3 2 NULLTable Insert 1 3 0Parallelism 3 3 NULLTable Insert 1 4 0Parallelism 3 4 NULL

1) Везде 0! Если поискать по всем собранным сведениям - также везде 0. Имхо, странно - почему это представление не собирает данные по inserted. Это недоработка номер 1.

2) Далее сами чтения непонятно откуда берутся - это баг номер 2. Ожидание, кстати, самое большое - SOS_SCHEDULER_YIELD, что также говорит об интенсивном сканировании страниц в памяти.

Вот описание на коннекте: Excessive number of Logical Reads when working with inserted table in a trigger on a partitioned table
Там еще таблица секционирована, как у ТС. Пишут что исправили в hotfix-е, проверил репро приведенное там - репро сработало.
Т.е. наблюдаем регресс. Проверял на версии 2014 CU1.

Можно накатить CU4 и проверить там, если описанное поведение наблюдается и там - можно смело писать в коннект о том, что есть регресс, пусть исправляют в следующем фиксе.
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38786552
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehowЯ тоже смотрел трейс и видел большое число необъяснимых чтений. Именно по этому, я попросил автора посмотреть, что твориться в dm_exec_query_profiles.ПОнятно, спасибо за разъяснение, я 2014 плотно только начал исследовать :-)

На баг конечно очень похоже, после трейса появилась уверенность почти на 100%
...
Рейтинг: 0 / 0
Долгая выборка из INSERTED\DELETED во временную таблицу
    #38788122
SomewhereSomehow,

Четверку пробовали. По крайней мере превышение чтений в псевдотейблах в 10 раз по сравнению с просто таблицей осталось. Это точно баг видимо. Что ж. У мелкософта "прямо" никогда не было.
...
Рейтинг: 0 / 0
138 сообщений из 138, показаны все 6 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая выборка из INSERTED\DELETED во временную таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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