|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Добрый день, товарищи! Столкнулся с проблемой долгой выборки из дрянотаблиц 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 сек. Вообще без разницы что пытаешься сделать- время всегда одно и тоже. Ну за исключением попытки фильтрации и сортировки оных псевдотейблов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 10:47 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, это для выполнения DSQL в триггере? Или для выполнения процедуры, обрабатывающей inserted/deleted? В других случаях не могу представить, зачем копировать эти псевдотаблицы во временные ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 10:56 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
И какие ожидания у сессии во время этих 45 секунд? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Да, мне надо их потом, асинхронно обработать. Для логирования вобщем надо. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
pkarklin, Никаких. Нулл в типе ожидания. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:02 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаpkarklin, Никаких. Нулл в типе ожидания. Запускайте UPDATE с включенным SET STATISTICS TIME и IO. Посмотрим, на что тратится время. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:04 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаpkarklin, Никаких. Нулл в типе ожидания. а в ресурсе? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:05 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаПритом результат один и тотже что выбирать ВСЕ столбцы, что один какой либо.Точно? А то, может, на таблице есть индекс с искомым полем, а таблица широкая... Да, с таким не сталкивался... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:07 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Предлагаете угадать, что Вы написали в триггере? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:11 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав КолосовПредлагаете угадать, что Вы написали в триггере?А как от этого может зависеть операция "SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED"? Зачем эта информация нужна? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:13 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
alexeyvgВладислав КолосовПредлагаете угадать, что Вы написали в триггере?А как от этого может зависеть операция "SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED"? Зачем эта информация нужна?А я подозреваю, что копирование deleted/inserted вообще не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
2pkarklin, для инсертеда статистика ИО не доступна. По крайней мере мне не выдает. Только по физической табличке. 2Владислав Колосов, так я написал же что там. там сейчас два запроса. Вам прямо конкретные названия моих таблиц надо? Бесполезны они вам будут. :) 2iap, я с радостью с Вам потрещу по этой теме потом. Когда Вы столкнетесь с необходимостью логирования изменений большго объема. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:38 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iap, да, как-то подозрительно выглядит. Не факт, что всё происходит так, как описывает автор. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:38 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
msLex, в ресурсе тоже пусто. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:39 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, только одна строчка в триггере? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:39 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона2pkarklin, для инсертеда статистика ИО не доступна. По крайней мере мне не выдает. Только по физической табличке. Ну так покажите, что Вы получили, выполняя UPDATE при установленных SETах. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:44 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
2Владислав Колосов, товарищ, давайте вы найдете где-нибудь у себя в закромах табличку с 300000+ записей и с порядка 70 полями. Запустите апдейт какого-либо поля по всем записям, в триггере напишете SELECT 1 FROM INSERTED , заключив этот запрос в SELECT GETUTCDATE() . И только потом будете утверждать что я что то тут выдумываю. Договорились? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:45 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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." Владислав, Остальное в тирггере не выполняется. После обозначенных запросов ретурн поставл я. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:47 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаКогда Вы столкнетесь с необходимостью логирования изменений большго объема. :)Ой, и правда! Что же я все эти 17 лет делал-то?! Ни разу не логировал такие серьёзные таблицы! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:49 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотоназаключив этот запрос в SELECT GETUTCDATE() .Это как? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:50 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:50 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iap, это вот таг. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:52 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:53 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона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? Если триггера нет, что будет со статистикой? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:53 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, SET установите в баче, который запускает UPDATE, а не в триггере. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:55 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:56 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаiap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :)Я, кажется, догадался. Речь идёт о легендарном "универсальном триггере"? Который по метаданным собирает запрос логгирования для полей любой таблицы, к которой прицеплен такой "универсальный триггер"? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 11:58 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iapАцкийСкотонаiap, таки у вас есть способ решить проблему с которой я столкнулся или нет? :) давайте по существу пожалуйста. :)Я, кажется, догадался. Речь идёт о легендарном "универсальном триггере"? Который по метаданным собирает запрос логгирования для полей любой таблицы, к которой прицеплен такой "универсальный триггер"? Ф точку. Только триггер не посвящен целиком логированию, там еще бизнес-логика. :) И с чего же легендарный он? От завершения меня отделяет только эта идиотская задержка, которой я моуг по идее принебречь. Подождут пользаки уже немонго. Всеравно вола валяют почти весь день. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:04 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаОт завершения меня отделяет только эта идиотская задержкаВот именно! Вот поэтому-то я давным-давно бросил эту идею. Плавали - знаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iapАцкийСкотонаОт завершения меня отделяет только эта идиотская задержкаВот именно! Вот поэтому-то я давным-давно бросил эту идею. Плавали - знаем. Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:15 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.можно же написать генератор кода ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:20 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаiapпропущено... Вот именно! Вот поэтому-то я давным-давно бросил эту идею. Плавали - знаем. Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.Проще логгировать записи, в которых изменилось хоть что-то, целиком. И с таким логом проще жить потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:21 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Shakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:29 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iapАцкийСкотонапропущено... Я тоже бросил затею делать это в самом триггере. :) Вот поэтому то мне и надо слизать псевдотаблички. Да бэ в другом процессе по ним неспешай пройтись. :) Ну и идея еще в универсальности кода логирования. Таблиц не одна сотня. Каждый раз переделывать везде- проще застрелиться.Проще логгировать записи, в которых изменилось хоть что-то, целиком. И с таким логом проще жить потом. Так чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы. К тому же, я уже упоминал, в триггере не только логирование. Есть еще триггеры с бизнес-логикой. И дикое торможение этих дурацких таблиц так же снижает и ее. Ну так что, знает кто причину почему тормозит выборка с псевдотаблиц?:) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:32 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаShakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :) насчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:37 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТак чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы.Странное утверждение. Главное, что надо сделать - забыть об универсальности. И заниматься логгированием каждой таблицы в отдельности. Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе. Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!). Да что там! Это логгирование можно оформить как отдельный триггер, а бизнес-логика пусть будет в другом! Триггеров же может быть много! Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:40 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ShakillАцкийСкотонаShakill, Облом ВЕЗДЕ. Сгенереный код тоже не видит инсертед\делетед. Я уже все перепробовал. Единственный сопоб- утащить эти таблички и потом их обрабатывать. :) насчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть. Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:43 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, Scan count 566 - очень много. Интересно, какой результат будет, если вы уберете триггер и воспользуетесь кляузой OUTPUT в UPDATE? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:49 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаShakillпропущено... насчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть. Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать. В единообразном коде, хранящемся в системе контроля версий, изменяемом централизованно и единообразно для всех таблиц? Скорее в вашей затее черт ногу сломит. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:49 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаНу так что, знает кто причину почему тормозит выборка с псевдотаблиц?:) Начиная с 2005, для получения данных из псевдо таблиц используется версионное хранилище в tempdb. Она у Вас не может являться узким местом? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:54 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Когда включаем репликацию на сервере (publisher), она сама вешает на все таблицы триггеры. И создает спец. таблицы в которых накапливает не отреплецированные данные. Чем не хорошая заготовка для системы логирования ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:55 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEЧем не хорошая заготовка для системы логирования ? Там нет данных о том, кто проводил модификацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:57 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iapАцкийСкотонаТак чтобы их целиком логировать мне какраз таки и надо прежде сохранить псевдотаблицы.Странное утверждение. Главное, что надо сделать - забыть об универсальности. И заниматься логгированием каждой таблицы в отдельности. Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе. Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!). Да что там! Это логгирование можно оформить как отдельный триггер, а бизнес-логика пусть будет в другом! Триггеров же может быть много! Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом. Главное, что надо сделать - забыть об универсальности. Увы, не могу без нее спать. :) И заниматься логированием каждой таблицы в отдельности. Сейчас итак так сделано. В каждом(необходимом) триггере в конце код логирования. И если схему логирвоания изменить, то мне придется помирать на применении новой идеи из-за 1000+ таблиц в базе. Можно, например, создать таблицы-логи с почти идентичной оригиналам структурой с помощью генерирования скриптов таблиц с обработкой полученного текста в каком-нибудь приличном редакторе. Шо я собственно и делаю путем SELECT * INTO #T_INSERTED FROM INSERTED Кроме тогго, текст логгирования для триггеров КАЖДОЙ ТАБЛИЦЫ можно получить универсальным запросом ОДИН РАЗ (скорость, как понимаете, уже не очень-то и важна!). 1. Повторяю еще раз. В триггере помимо кода логирования еще есть код, который не сгенерить. 2. Отдельных триггеров использовать возможности нет. Фист и ласт атрибуты заюзаны. 3. Скорость еще как тут важна, уж поверьте. :) 4. Код триггера должен в проекте быть, да бы иметь возможность рефакторинга. Да что там! Это логгирование можно оформить как отдельный триггер, а бизнес-логика пусть будет в другом! Триггеров же может быть много! 1. Можно, но должно оно быть в определенном. :) 2. Когда их много очережность выполнения гарантируется только для First- и Last- триггера. Такое не катит мне. :) Получится для каждой таблицы свой текст триггера, но сформированный не вручную, а запросом. Логирующий код я итак могу сформировать в зависимости от таблицы и того, какие поля в ней изменены. Притом сделать это на лету. :) К тому же, чтото никто не вспомнил тут про то, что АДО при апдейте апдейтит ВСЕ записи. :) Поэтому код триггера еще должен исключать неизмененные поля в записях да бы снизить жирность логов. Вот думаете если бы всё просто можно было просто сделать как говорите я бы не сделал что ли. :) Я заморачиваюсь не просто так, а надо ибо. Советы про то как логировать мне наверно не нужны. Я уже сам знаю как всё организовать. Мне только надо понять почему дико тормозит вборка из псевдотаблиц. Хоят в конечном итоге я на нее могу забить. Расчет у меня всеравно по нескольку часов идет. Что мне эти несчтастные 45-145 секунд. :) Итак, для вновь прибывших. :) Меня интересует именно торможение при выборке из псевдотаблиц. Как логировать я уже сориентировался. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 12:59 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаМеня интересует именно торможение при выборке из псевдотаблиц Торможение - это бонус вашей универсальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:03 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:11 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АДО при апдейте апдейтит ВСЕ записи Если я пишу Код: sql 1.
то обновятся все записи ? Никогда не встречался с таким поведением. В какой версии (mdac, sqlncli) такое ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаМеня интересует именно торможение при выборке из псевдотаблиц Торможение - это бонус вашей универсальности. Вообще то, чтобы изрекать тут что либо не по теме, прочитали бы сначала. Ну если вы не поняли, то объясню. Торможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере. Я уж не стал сразу гвоорить. Думал итак понятно будет. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:13 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
"Все" - в смысле, не только удовлетворяющие условию WHERE ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:14 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEАДО при апдейте апдейтит ВСЕ записи Если я пишу Код: sql 1.
то обновятся все записи ? Никогда не встречался с таким поведением. В какой версии (mdac, sqlncli) такое ? Я хз в какой. Я разработкой интерфейса к нашей бд не занимаюсь. Просто мне сказали что так и происходит. Я бы конечно выловил запрос щас с клиента, да лень чота. Да и к теме не относится. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:15 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТорможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере. Ну это же ваш выбор. Вы привели столько доводов в ответ на все возражения. И столько раз уверяли, что знаете, что делаете. Что выбрали - то и получили. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:16 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаАДО при апдейте апдейтит ВСЕ записи. :)Да неужели?! К тому же, что мешает выполнять свой явный UPDATE? Что касается логгирования только записей с изменениями, то этому здесь посвещено столько постов, что как же Вы их не увидели-то? Я и сам пару десятков раз участвовал... Да! О порядке вызовов триггеров. Если есть зависимость от порядка их вызова, то это уже плохой признак. Но какая, чёрт возьми, разница, в каком по порядку будет выполняться логгирование?! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:16 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона без тригера 2 сек, с триггером 5 сек, 500к записей 27 полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:18 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона tarrusпропущено... В единообразном коде, хранящемся в системе контроля версий, изменяемом централизованно и единообразно для всех таблиц? Скорее в вашей затее черт ногу сломит. Попробуйте сначала хотя бы номрально представить себе код, который генерит триггеры, хранящийся в системе контроля версий. :) Потом представьте что у вас изменилось 100-300 таблиц. Потом еще некоторые талбицы объеденились, некоторые разъеденились в новые. И заетм представьте себе как вы будете свой ацкий гениальный генерирующий триггеры код рефакторить. Обязательно мне сообщите сколько времени у вас ушло с сколько ведер слюны вы наплевали. Я уже давно для всех БД использую SQL Server Database Project и кодо-генерацию. Если вы не знаете как организовать процесс разработки, то открывайте новую тему. Думаю у многих есть чем поделится в этом направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Я хз в какой. Могу предположить, что речь идет не о вызове нормального, корректного SQL скрипта или процедуры, а о подключении компонентов типа ADOTable, и его методах. Тогда да, нужно исправлять интерфейс. Это совсем не дело в триггерах искать измененные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаЧестно сказать не понял. Можно поподробней про этом момент? Там насоклько знаю никакой версионности. Псевдотаблички на самом деле есть одна таблица, содержащая инсертед и делетед записи. Доступ через которые осуществляется через 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:24 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEЭто совсем не дело в триггерах искать измененные данные.Это почему же? Давно и успешно ищу именно в триггерах. Независимо от всяких там клиентов, как и положено. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:26 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Ох вы а, да чот заладили выбрал да выбрал. Ну архитектура такая. Ну вот предназначен триггер для выполнения каких то действий, используются при этом инсертед\делетед. Ну не я же придумал скуль а. :) GloryАцкийСкотонаТорможение псевдотаблиц не только не дает мне жить спокойно при доделывании универсального триггера, она так же тормозит остальную базнес-логику в триггере. Ну это же ваш выбор. Вы привели столько доводов в ответ на все возражения. И столько раз уверяли, что знаете, что делаете. Что выбрали - то и получили. Это не мой выбор. Это так задумано вообще. Есть таблицы. На них триггера. Люди с таблицами работают. Триггера срабатывают. Чтото там делают... Сэ ля ви же. Я то причом тут?:) iapАцкийСкотонаАДО при апдейте апдейтит ВСЕ записи. :)Да неужели?! К тому же, что мешает выполнять свой явный UPDATE? Что касается логгирования только записей с изменениями, то этому здесь посвещено столько постов, что как же Вы их не увидели-то? Я и сам пару десятков раз участвовал... Да! О порядке вызовов триггеров. Если есть зависимость от порядка их вызова, то это уже плохой признак. Но какая, чёрт возьми, разница, в каком по порядку будет выполняться логгирование?! К тому же, что мешает выполнять свой явный UPDATE? В клиенте? Вы работали сишарпом к бд хоть раз? Мне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи. Что бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще. Не вдавался в подробности вобщем. Что касается логгирования только записей с изменениями, то этому здесь посвещено столько постов, что как же Вы их не увидели-то? Я и сам пару десятков раз участвовал... Да блин. Да не надо мне помощи в логировании. У меня есть отличный механизм. Мне только надо разобраться почему выборка с псевдотаблиц тормозит так. Сколько раз повторить еще?:) Если есть зависимость от порядка их вызова, то это уже плохой признак. Ничего плохого в этом нет. Либо представьте уж тогда ваш личный плохой пример. На который я наверняка найду что сказать. :) Я и сам пару десятков раз участвовал... Прошу прощенья за нескромный вопрос. А хоть раз реально помогли вопрошающим? Или как и мне только и говорите что я везде неправ? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:30 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаЭто не мой выбор. А кто тут распинался про универсальный триггер ? АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи. По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать АцкийСкотонаЧто бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще. У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:35 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав КолосовАцкийСкотона без тригера 2 сек, с триггером 5 сек, 500к записей 27 полей. А вот это уже конструктивно. Круто! А что именно в триггере выполняется? Так же как и у меня селект из инсертеда? Апдейтите все записи в таблице? Поля варчаровские есть кстатьи, гуиды? И у меня 68 полей. [/quot] Я уже давно для всех БД использую SQL Server Database Project и кодо-генерацию. Если вы не знаете как организовать процесс разработки, то открывайте новую тему. Думаю у многих есть чем поделится в этом направлении.[/quot] Спасибо, но думаю в билинге мне кодогенерация не нужна. У нас четкая бизнес-логика. Потребностей в генерации чего-то там особо нет. :) ART-CODEЯ хз в какой. Могу предположить, что речь идет не о вызове нормального, корректного SQL скрипта или процедуры, а о подключении компонентов типа ADOTable, и его методах. Тогда да, нужно исправлять интерфейс. Это совсем не дело в триггерах искать измененные данные. Ф точку! Но пока мне придется разбираться с этим на уровне БД. Ничего страшного С этим будет разбираться CLRка в отдельных потока. Переживу. :) 2pkarklin , если вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:39 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iap, Прошу прощения, небольшая путаница произошла - кто о чем говорил. Вы правы. Тут автор уточнил:ВСЕ поля в бд для этой записи Все, разобрались. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:40 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаесли вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :) http://technet.microsoft.com/en-us/library/ms175527(v=sql.105).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:42 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаЭто не мой выбор. А кто тут распинался про универсальный триггер ? АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи. По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать АцкийСкотонаЧто бы сделать апдейт только апдейченых(гы), то там надо както заморачиваться еще. У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ? А кто тут распинался про универсальный триггер ? Я про логирование говорил. :) По-умолчанию - это значит, когда ленивый программист вообще не захотел ничего задать Не стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок? У вас существует ТЗ ??? Там что так и написано "программируйте, чтобы не надо как-то было заморачиваться" ? Человек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!! Кстатьи, у вас там в ТЗ не прописано как должна работать выборка с инсертед\делетед?:) А можно почитать?:) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:43 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона А кто тут распинался про универсальный триггер ? Я про логирование говорил. :) Фейспалм. АцкийСкотонаНе стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок? Ну разумеется. Весь ваш код и способы просто шедевры программисткой мысли. А дурацкий сервер не желает выполнять такой прекрасный код. АцкийСкотонаЧеловек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!! Я понял. ТЗ - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:46 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаесли вас не затруднит, ткните меня пожалуйста носом в то место статьи, которое надо познать да бы ускорить выборку? :) http://technet.microsoft.com/en-us/library/ms175527(v=sql.105).aspx Там только про авторазрастание. Давайте конкретнее. Ссылок буз объяснений я тоже могу накидать. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:48 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТам только про авторазрастание. Давайте конкретнее. А вы это уже выполнили что ли ? АцкийСкотонаДавайте конкретнее. Ссылок буз объяснений я тоже могу накидать. Если вы ищите кнопку "Работай быстро", то ее не существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:49 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаShakillнасчет генератора кода я имел в виду не формирование динамики в триггере (хотя и туда можно передать через табличную переменную), а генерация самого триггера на основе шаблона и указания таблицы, на которой он будет висеть. Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать. один шаблон логирования, разный набор полей. запуск генератора триггеров по необходимости - при изменении таблиц и когда собираетесь изменить логику логирования. а в чем трудности поиска ошибок? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:56 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотона А кто тут распинался про универсальный триггер ? Я про логирование говорил. :) Фейспалм. АцкийСкотонаНе стоит обвинять кого-либо, если не знаете сами как это умолчание обойти. Ок? Ну разумеется. Весь ваш код и способы просто шедевры программисткой мысли. А дурацкий сервер не желает выполнять такой прекрасный код. АцкийСкотонаЧеловек молодой. Де вы видели ТЗ, которое диктует как работать фреймворкам? Где вы вообще видели писателя ТЗ который слышал слово фреймворк? Что вы прям а. :) ЕСли у вас на каждый чих есть ТЗ- возмите меня к ВАМ!!! Я у вас буду СЧАСТЛИВ!!! Я понял. ТЗ - нет. Фейспалм. Ну ладно. Не буду заставлять вас понимать чег оя именно хочу добиться. Ну разумеется. Весь ваш код и способы просто шедевры программисткой мысли. Я не говорил этого. Я вообще в код клиента не лазаю. Не вижу щас причины что вы так на меня прёте. :) А дурацкий сервер не желает выполнять такой прекрасный код. Ну не само железо конечно. Но скуль по идее полон мест которые вроде как должны быть дико скоростны и удобны, но на самом деле настолько сыры, что никакого желания(и пользы) юзать нет. Вспомним хотя бы дикокласнцю идею про CLR-триггер, который не знает(и никак совершенно узнать не может) на какой же он таблице выполнился! :) Давайте не будем . :) Мне от вас надо только решение проблемы с тормозами по выборки из псевдотаблиц. Остальное можно обсудить за рамками данной темы, если вам так интересно. :) GloryАцкийСкотонаТам только про авторазрастание. Давайте конкретнее. А вы это уже выполнили что ли ? АцкийСкотонаДавайте конкретнее. Ссылок буз объяснений я тоже могу накидать. Если вы ищите кнопку "Работай быстро", то ее не существует. 1. Что конкретно там выполнить надо? Вы нормально объясниете. 2. Да не ищу я. Я привык работать нормально, а не на отъ***сь. Поэтому и не делаю в каждом триггере кастомный говнокод лишь бы побыстрее задачу закрыть! В виду этого пришел к тому, что механизм логироания должен быть уиверсальным, насколько это возможно. Повторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки, чем потом при изменени модели логирования лопатить ВСЕ триггеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 13:57 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаПовторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки Ну так запихните, что хотите. Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ShakillАцкийСкотонапропущено... Не катит. Таблиц сотни. Потом в таких шаблонах черт ногу сломит. Да и ошибки трудно будет искать. один шаблон логирования, разный набор полей. запуск генератора триггеров по необходимости - при изменении таблиц и когда собираетесь изменить логику логирования. а в чем трудности поиска ошибок? Опять.... В триггере не только механизм логирования. Там еще есть действия над другими объектами БД, с приджойниванием псевдотаблиц. Проблем с логирвоанием у меня НЕТ! :) У меня проблема с тормозами SELECT 1 FROM INSERTED. Прочтите тему с начала .если не понимаете об чем речь идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаУ меня проблема с тормозами SELECT 1 FROM INSERTED. Ну так поставьте диски побыстрее, процессоры побстрее, памяти побольше, редакцию постарьше. Делайте что нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:03 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаПовторяюсь. Мне проще один раз запихнут в каждый тирггер вызов моей CLRки Ну так запихните, что хотите. Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ? Повторяю еще раз. Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:03 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаGloryпропущено... Ну так запихните, что хотите. Что вам от сервера то нужно ? Чтобы он ваши "сексуальные" фантазии воплощал в жизнь ? Повторяю еще раз. Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.Не выбирайте из inserted, раз не устраивает. Выбирайте из временной таблицы. Что непонятного? И да, версия сервера какая? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:05 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаПовторяю еще раз. Если сто раз повторить "халва", то во рту слаще не станет АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5. Повторяю еще раз (гы) - кнопки "Работай быстро" не существует. Если "переливание" всех данных из временной таблицы во временную таблицу работает медленно, то нет программных средств ускорения. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:08 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАцкийСкотонапропущено... Повторяю еще раз. Мне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5.Не выбирайте из inserted, раз не устраивает. Выбирайте из временной таблицы. Что непонятного? И да, версия сервера какая? Для тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка? 2014 скуль. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:10 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. О Боже ! В каком отдельном потоке вы собрались обрабатывать локальную временную таблицу ??? Вы хоть читали в хелпе хоть что нибудь про временные таблицы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаПовторяю еще раз. Если сто раз повторить "халва", то во рту слаще не станет АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details"(это таблица на которой триггер, если чо). Что непонятного?:) Ну не устраивает меня 45 секунд против 0,5. Повторяю еще раз (гы) - кнопки "Работай быстро" не существует. Если "переливание" всех данных из временной таблицы во временную таблицу работает медленно, то нет программных средств ускорения. Халва. :) Так почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? У вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:14 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? Потому что это разные таблицы в разных базах. Сюрприз ??? АцкийСкотонаУ вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:) Какая дискуссия может быть при отсутствии у вас знаний предметной области ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:14 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? У вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:) Потому что, для переливания из inserted, серверу ее предварительно приходиться создавать и заливать туда данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:15 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. О Боже ! В каком отдельном потоке вы собрались обрабатывать локальную временную таблицу ??? Вы хоть читали в хелпе хоть что нибудь про временные таблицы ? Так, не надо щас вот тут издыханий вашего ЧСВ а. Всё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML оба буфера и отдается сервисброкером другому процессу. Другой процесс распарсит хмл, прочухает какие поля обновились, а какие нет. Сформирует результирующий ХМЛ. Создаст строки в таблице логов. Вот. Заставили такие меня свою идею раскрыть. :) Еще вопросы есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:17 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка?Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас. На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка? В отдельном потоке обработать данные из локальной временной таблицы?! Чтоб "не задерживаться в триггере" есть Service Broker. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEВсе, разобрались. Код: sql 1.
Срочно забудьте это навсегда! Что, по-Вашему, делает функция UPDATE()? Я не очень понял, в чём именно я был прав :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
GloryАцкийСкотонаТак почему из физической таблицы переливание 0,5 сек, а с инсертед 45 сек? Потому что это разные таблицы в разных базах. Сюрприз ??? АцкийСкотонаУ вас есть или нет ответ на этот вопрос? Или вам просто подискутировать охота?:) Какая дискуссия может быть при отсутствии у вас знаний предметной области ? Молодец, орёл! Конечно же физическая таблица и ее инсертед\делетед В РАЗНЫХ БАЗАХ. Ваша копметентность в плане программирования БД пошатнулась в моих глазах. Прошу больше чуши не нести. Если есть что сказать по теме- с радостью выслуашую. Дальше бред мне слушать не интерсно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:21 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаМне сейчас объяснили что датапровайдеры по умолчанию при апдейте поля в датасете апдейтят ВСЕ поля в бд для этой записи. Кто мешает не использовать датасет? Есть куча ORM, которые отслеживают изменения и пишут только их... АцкийСкотонаДе вы видели ТЗ, которое диктует как работать фреймворкам? Таких нет. Но если у программиста кривые руки, то, конечно, виноват фреймворк. АцкийСкотонаМне надо чтобы "SELECT * INTO #T_INSERTED FROM INSERTED" выполнялось так же быстро, как и "SELECT * INTO #T_INSERTED2 FROM Charge_Details" попробуйте переписать на insert into #T_INSERTED (перечислите явно столбцы) select перечислите явно столбцы from INSERTED АцкийСкотонаДля тех, кто не читал тему целиком. Выборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка? Зря. К тому же для логирования можно Service Broker использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
pkarklinАцкийСкотонаВыборку из инсертед я произвожу да бы потом в отдельном потоке ее обработать. Чтобы не задерживаться на этом в триггере. Теперь понятно зачем мне выборка? В отдельном потоке обработать данные из локальной временной таблицы?! Чтоб "не задерживаться в триггере" есть Service Broker. Так я двумя постами выше же сказал что сервисброкером буду работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаГавриленко Сергей Алексеевичпропущено... Да мне все равно, зачем вы ее производите. Если вам нужно "ехать", то процесс массового обновления записей надо строить по-другому, чтобы не лезть в псевдо-таблицы. Если "шашечки", ну, дисков там купите, SSD, плату флешовую за $50к для tempdb. Программиста, в конце концов, наймите, чтобы сделал все за вас. На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут. Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаВсё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML Еще вопросы есть? Угу. Как Вы из CLR достучитесть до локальной временной таблицы? Даже если достучались, с чего Вы решили, что CLR будет работать асинхронно по отношению к триггеру? Почему прямо в триггере не сформировать XML (на такую большу таблицу при полном апдейте, правда он будет не хилый) и поставить сообщение в очередь SB? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаТак, не надо щас вот тут издыханий вашего ЧСВ а. Всё просто. В триггере копируется во временную таблицу, в CLRке(вызываемой в триггере) херачится в XML оба буфера и отдается сервисброкером другому процессу. Другой процесс распарсит хмл, прочухает какие поля обновились, а какие нет. Сформирует результирующий ХМЛ. Создаст строки в таблице логов. Вот. Заставили такие меня свою идею раскрыть. :) Еще вопросы есть? Двойной фейспалм. Заставить сервер создать временную таблицу inserted. Чтобы скопировать ее во другую временную таблицу. Чтобы на ее основе создать xml. Чтобы его передать куда-то. Чтобы его потом распарсить. Чтобы что-то определить. Чтобы на основе этого создать еще один xml. Который потом добавить в таблицу. Это тянет на Нобелевку Пойдука я лучше в другие темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:23 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАцкийСкотонапропущено... На личности съезжаемс, товарищ? Вам по ходу кроме как трепнуть чушь больше интелект не позволяет. Прошу отлучиться от обсуждения данной темы. Вам по видимому место в болтологии. Никак не тут.Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете. Пардон муа. Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED. Итак. Поехали. У меня два таблицы. 1. Шапки документов. 2. Строки документов. Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:27 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаГавриленко Сергей Алексеевичпропущено... Модератор: На личности съехали исключительно вы, я ни вас, ни ваш интеллект, ни то, где вам место, не обсуждал. Еще раз позволите себе такое поведение, и вы форум покинете. Пардон муа. Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED. Итак. Поехали. У меня два таблицы. 1. Шапки документов. 2. Строки документов. Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.Я вам по секрету скажу: это можно сделать без триггера быстро. Или с триггером долго. Выбирайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:29 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаПредоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED. Итак. Поехали. У меня два таблицы. 1. Шапки документов. 2. Строки документов. Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED. Гм... Триггер, не единственный способ (а м.б. и не самый лучший) реализации поставленной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:30 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаЯ поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATEDДля этого не нужен триггер (хотя вот у нас тоже в триггере сделано). Индексированное представление вместо шапки! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:30 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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. Что именно зря? Зачем мне лопатить миллионы записей в лог именно во время их апдейта? Пару минут и подождать могут. Не лезут же пользаки после каждой операции в лог, смотреть что там где проапдейтилось. Да большство планктона вообще не подозревает об существовании логирования. Хотя на основании которого переодически по шапке получает за ковыряние в базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:35 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Гавриленко Сергей АлексеевичАцкийСкотонапропущено... Пардон муа. Предоставьте хотя бы слух об паттерне работы триггера, который как-то отрабатывает изменения строк своей таблицы, но апдейтит зависимые таблицы без сущностей INSERTED\DELETED. Итак. Поехали. У меня два таблицы. 1. Шапки документов. 2. Строки документов. Я поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATED.Я вам по секрету скажу: это можно сделать без триггера быстро. Или с триггером долго. Выбирайте. Так я ж жду, говорите. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:36 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iap, UPDATE() Есть, конечно, свои минусы.возвращает TRUE независимо от того, была ли попытка применить операторы INSERT или UPDATE удачной. Давно сам ее не использовал (лет 7 уже), потому забыл. Ну, можно просто сравнивать старое и новое значение. Возможно, COLUMNS_UPDATED есть. не очень понял, в чём именно я был прав Да, можно искать измененные данные, если они были изменены специально, осмысленно, а не вся таблица скопом перезаписывается и ищи в этой каше - какая же строка на самом деле обновилась. Изначально было сказано, что обновляются ВСЕ ЗАПИСИ. И лишь потом пришло уточнение что не все записи а все поля. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:38 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
iapАцкийСкотонаЯ поменял сумму в строке. Как триггер строк должен выйти на шапки и изменить общую сумму кроме как с использованием INSERTED\UPDATEDДля этого не нужен триггер (хотя вот у нас тоже в триггере сделано). Индексированное представление вместо шапки! Не прокатит. У строк должны быть ссылки на сущность их содержащую. Таблиц в базе не ДВЕ. А сотни. Многие взаимодействуют со многими. Вообще реализация БД это не тема данной беседы. Архитектура релизована так как реализована. Насколько мне изместно конкурентов у нас по этой тебе адекватных нет. Давайте больше реализацию БД обсуждать не будем. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:38 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEiap, UPDATE() Есть, конечно, свои минусы.возвращает TRUE независимо от того, была ли попытка применить операторы INSERT или UPDATE удачной. Давно сам ее не использовал (лет 7 уже), потому забыл. Ну, можно просто сравнивать старое и новое значение. Возможно, COLUMNS_UPDATED есть. не очень понял, в чём именно я был прав Да, можно искать измененные данные, если они были изменены специально, осмысленно, а не вся таблица скопом перезаписывается и ищи в этой каше - какая же строка на самом деле обновилась. Изначально было сказано, что обновляются ВСЕ ЗАПИСИ. И лишь потом пришло уточнение что не все записи а все поля. И лишь потом пришло уточнение что не все записи а все поля. БЛ базы обновляет конкретные. Это клиентская часть в некоторых реализациях апдейтит все поля строки БД, которые были в датасете. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:41 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаВообще реализация БД это не тема данной беседы. Архитектура релизована так как реализована. Насколько мне изместно конкурентов у нас по этой тебе адекватных нет. Давайте больше реализацию БД обсуждать не будем. Если так, то нужна конкретика. Вот я попытался воспроизвести проблему, у меня не получилось такой задержки (правда я на 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.
Случай, что вторая выборка в первый раз идет ощутимо быстрее, примерно 45 секунд против 5 секунд (на моей машине), за счет того, что в первый раз данные поднимаются в кэш, второй раз быстро, и могут вымываться между тестами - мы ведь исключаем? т.е. проблема у вас воспроизводится постоянно и не зависит от того в каком порядке идут в тестовом триггере выборка из inserted и таблицы? Соответственно, если хотите конкретики - модифицируйте скрипт так, чтобы проблема воспроизвелась, либо предоставьте свой. Если это проблема воспроизводится только у вас, из-за вашей конфигурации оборудования/настроек/магнитных полей, то необходимо предоставить информацию по ожиданиям. Вы писали: авторНикаких. Нулл в типе ожидания. Может вы не правильно смотрели, или не в тот момент? Попробуйте собрать ожидания при помощи события sqlos.wait_info Короче, чтобы адресовать вашу проблему предметно нужно либо иметь репро, либо иметь какие-то данные того, что происходит на сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 14:59 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
ART-CODEВозможно, COLUMNS_UPDATED естьТо же самое. Смысл имеет лишь сравнение соответствующих записей deleted и inserted. Если записей более одной, то это возможно только при наличии полей, однозначно связывающих deleted и inserted и неизменившихся в результате данного UPDATE. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:01 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, триггер такой: Код: sql 1. 2. 3.
Таблица: 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 маловато для таких операций. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:10 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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 Я не знаю как у вас отрабатывает быстрее. А сколько конкретно первый и второй стейтмент по времени идут? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав Колосов, Ну у меня полей поболее. Сколько ваш запрос занимает? Сделайте еще селект инто с физической таблицки на которой триггре висит. У вас есть такая же разительная разница как у меня? Кста, основныей файлы БД и темпдб на одном диске? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:25 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:47 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав КолосовАцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось. а можете во так у себя попробовать? select getutcdate() select * into #inserted from inserted select getutcdate() select * into #inserted2 from temp.cust select getutcdate() Какие результаты в секундах у первого и второго? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:54 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, Быстрее только в первый раз, в дальнейшем ситуация как у вас не воспроизвелась. У вас же, как я понял, ситуация воспроизводится стабильно. Ок, вы не видите активности на сервере, но посмотрите при помощи расширенного события, чего ждет запрос? Планы что-нибудь показывают? Например, при сканировании обычной таблицы параллельный скан , при сканировании inserted нет. Но у меня такая разница как у вас не воспроизводится, впрочем я ничего не знаю ни о ваших данных, ни об условиях, ни о способе измерения. Как я уже говорил, либо репро, либо какая-то конкретика, чего так долго ждет запрос. А то получается, что у вас медленно, воспроизвести в простом случае это нельзя, а больше никаких данных вы не даете. Гадать можно долго, хотя, может рано или поздно кто-то угадает, но я это делать не берусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 15:58 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаВладислав КолосовАцкийСкотона, у нас хранилище, а не диск. Добавил вставку - еще 1-2 секунды прибавилось. а можете во так у себя попробовать? select getutcdate() select * into #inserted from inserted select getutcdate() select * into #inserted2 from temp.cust select getutcdate() Какие результаты в секундах у первого и второго? Просто во временную таблицу - секунда, из inserted - около 5 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:04 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Ну у меня такие же планы ка у вас. Один в один наверно даже по цифрам. Тоже вся стоимость в скане инсертеда. А какие мне вам данные еще дать? Сами данные не могу, пардон, они закрытые. :) Могу структуру таблички дать завтра. Щас сваливаю. Резину менять надо. Страшно а то по снегу на грязевой катать. :D ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:04 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав Колосов, а сколько строк в таблице? И какова примерная плотность заполнения полей? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:05 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, в триггере 98% времени выполнения занимает вставку во временную таблицу, 2% скан inserted. Тем не менее, вставка в триггере выполняется намного медленнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаА какие мне вам данные еще дать? Репро, т.е. такой скрипт, запустив который у участников форума воспроизвелось бы описываемое поведение. Да, это муторно, нужно делать скрипты тестовых таблиц, заполнять их какими-то псевдо данными и т.д., но это лучший способ получить предметный ответ. Если репро не получается сделать, то хотя бы ожидания (в третий раз по-моему повторяю) при выполнении вашего запроса на вашем сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
500000 строк, я же писал. Размер - 77 мб. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:13 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав КолосовАцкийСкотона, в триггере 98% времени выполнения занимает вставку во временную таблицу, 2% скан inserted. Тем не менее, вставка в триггере выполняется намного медленнее. А ничего не путаете? У меня и у SomewhereSomehow 98% именно скан инсерта, а не вставка во временную таблицу. Вот попробуйте просто селект 1 из инсертеда сделать. Ради интереса. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:52 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Владислав Колосов500000 строк, я же писал. Размер - 77 мб. У меня триста тыщ 308 метров весят. Судя по плану. План свой показать для обоих запросов можете, если не затруднит? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 16:54 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehowАцкийСкотонаА какие мне вам данные еще дать? Репро, т.е. такой скрипт, запустив который у участников форума воспроизвелось бы описываемое поведение. Да, это муторно, нужно делать скрипты тестовых таблиц, заполнять их какими-то псевдо данными и т.д., но это лучший способ получить предметный ответ. Если репро не получается сделать, то хотя бы ожидания (в третий раз по-моему повторяю) при выполнении вашего запроса на вашем сервере. Проблематично мне такой скрипт написать. А насчёт ожиданий, так я же писал. Там промелькивает цхпакет , асинхрон Ио, но они не висят при запросе. Просто может совпало так. Я их не каждый раз вижу. Завтра хочу посмотреть план реалтайм прямо, который в момент выполнения юзать. Может что-то в настройках инстанса? Есть идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 17:02 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаМожет что-то в настройках инстанса? Есть идеи?Тут обсуждение превратилось в какое то препирательство по общесиквельной тематике. Привнесите конкретику. Выложите результат трейса (с заходом внутрь), в виде файла трейса, для вариантов с SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED и SELECT "ПОЛЕ" INTO #T_INSERTED FROM "Таблица_на_которой_стоит_триггер" Можно даже это сделать в одном триггере, поменяв, естественно, имя временной таблицы для второго инсёрта. А то у вас из фактов - какие то тексты сообщений со статистикой (естественно, без названий стейтментов), по которым вы делаете какие то предположения. Реально же вы не знаете, что у вас там "тормозит". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 17:47 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаА насчёт ожиданий, так я же писал. Там промелькивает цхпакет , асинхрон Ио, но они не висят при запросе. Просто может совпало так. Я их не каждый раз вижу. 16737238 : SomewhereSomehowПопробуйте собрать ожидания при помощи события sqlos.wait_info ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 18:25 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Параллелизм при одновременной вставке во временную таблицу. Похоже, типа. Вообще какой-то странный лог для операции массового апдейта. Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2014, 23:32 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SIMPLicity_Параллелизм при одновременной вставке во временную таблицу. Похоже, типа. Вообще какой-то странный лог для операции массового апдейта. Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится Тему прочитайте. Прежде чем выводы делать. Я неоднократно говорил что именно тормозит. Не вставка отнюдь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 08:37 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
alexeyvg, Какой вам еще трейс надо? В каком виде? Общепринятый стандарт форума есть? Если есть прошу указать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 08:59 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаalexeyvg, Какой вам еще трейс надо? В каком виде? Общепринятый стандарт форума есть? Если есть прошу указать.В профайлере нажимаете кнопочку Save, трейс сохраняется. Сохранённый файл прикладываете к посту в форуме. При иследовании проблем производительности всегда используют профайлер, по крайней мере, если речь не об отладке одиночного запроса (да и в этом случае непонятно, зачем от него отказываться). Для вашей задачи выберите следующие настройки профайлера, обратите внимание на набор Events и установите SPID из того окошка, откуда запускаете обновление таблицы: ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 09:12 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаSIMPLicity_ Параллелизм при одновременной вставке во временную таблицу. Похоже, типа. Вообще какой-то странный лог для операции массового апдейта. Кстати, херачьте тогда уж в табличную переменную, чо. По крайней мере, она после роллбэка сохранится Тему прочитайте. Прежде чем выводы делать. Я неоднократно говорил что именно тормозит. Не вставка отнюдь. Прошу прощения, есличо. Ориентировался исключительно на ТЕМУ. Топег дальше второй страницы не читал,- он там, похоже ( как тут принято ), сваливается в говно. Про "тормоза" - просто поделился опытом: было нечто похожее,- переписал - заработало шустро. Удачи, типа! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 10:43 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SIMPLicity_, Если бы прочитали "дальше второй страницы", то увидели бы что тормозит не вставка во временную таблицу, а сам выбор из инсертеда. Удачи Вам в дальнейшем с таким "подходом" к вопросам! alexeyvg, Я для этих целей, дэбага, конечно несколько другие методы использую. Но понимаю что вам надо некоторые данные с трейса. Сейчас раскидаю таски и сделаю вам трейс в запрошенном виде. Ориентировочно- после обеда. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 11:33 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
alexeyvg, Вот трейс. Но ничего полезного для решения проблемы там нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2014, 13:41 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаalexeyvg, Вот трейс. Но ничего полезного для решения проблемы там нет.А что с памятью в момент выполнения? PLE? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 06:54 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
Mind, Памяти вагон. Еще идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 08:25 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаЕще идеи? Да идей-то может быть тоже вагон и маленькая тележка, но кому интересно играть в эту угадайку. 16737238 авторПопробуйте собрать ожидания при помощи события sqlos.wait_info 16737828 авторно посмотрите при помощи расширенного события, чего ждет запрос? 16737989 авторЕсли репро не получается сделать, то хотя бы ожидания 16739168 авторПопробуйте собрать ожидания при помощи события sqlos.wait_info И репро делать не хотите. Только удачи можно пожелать, ибо надежда на нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 09:00 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотонаКонкретнее. Имеем два стейтмента. 1. SELECT "ПОЛЕ" INTO #T_INSERTED FROM INSERTED и 2. SELECT "ПОЛЕ" INTO #T_INSERTED FROM "Таблица_на_которой_стоит_триггер" В таблице 350000 записей. Проводится апдейт всех записей по некому полю, думаю не важно по какому. Результат: 45сек и 0,5 сек. Притом результат один и тотже что выбирать ВСЕ столбцы, что один какой либо. Даже если написать Патамушто 2. есть документированный BULK (т.е. минимально логгируемая операция), а 1. никогда такой не будет. Патамушто в транзакции. ЗЫ. Ну а в остальном - присоединимся с предыдущим ораторам: херней маетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 09:02 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
aleks2, без стрельбы в воздух пожалуйста. оба стейтмента внутри триггера. оба выполняются под транзакцией. бесполезные коменты прошу оставить при себе. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:52 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehow, чтобы выполнить тот скрипт необходимо создавать евент. на его создание необходимы права, которые мне не дали. Чем вас не устраивает скрипт, который я прилагал ранее? Он и ожидания и ресурсы показывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:53 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
АцкийСкотона, Тем, что показывает текущее ожидание и зависит от момента запуска. Сбор событий позволяет получить полную картину. Пусть соберет тот, у кого есть права, раз не хочет вам давать. Хотя странна такая избирательность, на профайлер есть, а тут закрыли? Еще можете попробовать, раз у вас 2014 сервер, выполнить запрос в режиме set statistics xml on, и через некоторое время, пока он выполняется, сделать в другом окне запрос к представлению - sys.dm_exec_query_profiles - посмотрите кто дольше всех выполняется и что происходит. Сам апдейт с триггером, если закомментировать обращение к таблице inserted, сколько выполняется? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 12:19 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
aleks2Патамушто 2. есть документированный BULK (т.е. минимально логгируемая операция), а 1. никогда такой не будет. Патамушто в транзакции.Дело не в этом. Вот есть 2 операции, обе в транзакции: Код: sql 1. 2.
Вообще загадка, интересно, я даже установил себе 2014, чтобы трейс прочитать :-) Запись там жалких 500 страниц для первого стейтмента и 1000 для второго (в первой 2 поля (16 байт), во второй *(942 байт) ). BULK или нет, неважно, операция мизерная. А вот чтений страниц: 194149595 для первого, и 28239 для второго. Почему??? Чего там читать, 1.6 террабайта для мизерных 300 тысяч нешироких строк??? Отличие в планах в операторе Distribute Streams... 2 АцкийСкотона Не могли бы вы сделать ещё один трейс, сделав стейтменты по возможности одинаковыми, исключив паралелизм? Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 23:56 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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 секунд на сам апдэйт ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 00:11 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehowНо у меня такая разница как у вас не воспроизводится, впрочем я ничего не знаю ни о ваших данных, ни об условиях, ни о способе измерения. Как я уже говорил, либо репро, либо какая-то конкретика, чего так долго ждет запрос.А сколько у вас чтений для первого и второго запроса, и сколько время выполнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 00:14 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
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.
Запускаем вместе с профайлером: Код: sql 1. 2. 3. 4.
Далее, быстренько в другом окне смотрим что в sys.dm_exec_query_profiles, т.к. у меня слишком быстро выпоняется триггер, я в цикле собираю сведения, ТС-у можно этого не делеать. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Теперь, смотрю, что получилось в sys.dm_exec_query_profiles: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Для таблицы выдает: 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 и проверить там, если описанное поведение наблюдается и там - можно смело писать в коннект о том, что есть регресс, пусть исправляют в следующем фиксе. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 10:10 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehowЯ тоже смотрел трейс и видел большое число необъяснимых чтений. Именно по этому, я попросил автора посмотреть, что твориться в dm_exec_query_profiles.ПОнятно, спасибо за разъяснение, я 2014 плотно только начал исследовать :-) На баг конечно очень похоже, после трейса появилась уверенность почти на 100% ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 12:47 |
|
Долгая выборка из INSERTED\DELETED во временную таблицу
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Четверку пробовали. По крайней мере превышение чтений в псевдотейблах в 10 раз по сравнению с просто таблицей осталось. Это точно баг видимо. Что ж. У мелкософта "прямо" никогда не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2014, 13:10 |
|
|
start [/forum/search_topic.php?author=nikita&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
161ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
131ms |
get tp. blocked users: |
2ms |
others: | 245ms |
total: | 605ms |
0 / 0 |