powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая выборка из INSERTED\DELETED во временную таблицу
13 сообщений из 138, страница 6 из 6
Долгая выборка из 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
13 сообщений из 138, страница 6 из 6
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая выборка из INSERTED\DELETED во временную таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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