Имя: Пароль:
1C
1С v8
Сложности отладки временных таблиц. :-)
0 H A D G E H O G s
 
18.11.12
23:12
Ночи доброй.
Циничная мордочка как бы говорит нам, что все не так просто.

Как хотя бы выполнить такой запрос:

exec sp_executesql N'INSERT INTO #tt2 (_Q_003_F_000_TYPE, _Q_003_F_000_RTRef, _Q_003_F_000_RRRef, _Q_003_F_001) SELECT
T1.Q_002_F_000_TYPE,
T1.Q_002_F_000_RTRef,
T1.Q_002_F_000_RRRef,
T1._Q_000_F_000
FROM #tt1 T1 WITH(NOLOCK)

при условии, что #tt1 создана в сеансе сервера 1С и недоступна мне, простому смертному, запускающему EM под другим сеансом?
1 H A D G E H O G s
 
18.11.12
23:12
Можно как то EM-ом подключиться к существующему сеансу?
2 H A D G E H O G s
 
18.11.12
23:13
И напоследок, как построить годный план запроса для конструкции вида
exec sp_executesql

не переписывая запрос и его параметры.
3 H A D G E H O G s
 
18.11.12
23:15
Я не вижу ваших ников под заголовком. Это меня демотивирует...

Запрос валит 42 гиговый сервер клиента влет, поэтому тренируюсь на кошках (на нашем серваке, пока выходные).
4 H A D G E H O G s
 
18.11.12
23:18
ладно, хрен с ней, с #tt1
5 H A D G E H O G s
 
18.11.12
23:18
Как построить годный план запроса? Чтобы он не был одним куском со 100% времени выполнения.
6 H A D G E H O G s
 
18.11.12
23:19
А то там порядка 50 параметров, я заколебусь их константировать.
7 H A D G E H O G s
 
18.11.12
23:21
Отвечать пойдеееееет.
Отвечать пойдет
Salvador Limones

Salvador Limones , к доске!
8 Александр_
Тверь
 
18.11.12
23:36
приятно поговорить с умным собеседником?
9 Asmody
 
18.11.12
23:37
(0) в EI вроде были средства для перехвата профайлера в сеансе сервера если я не путаю
10 H A D G E H O G s
 
18.11.12
23:38
(8) Ты про что?
11 TormozIT
 
гуру
19.11.12
00:07
1. Сначала рекомендую техножурналом отловить строку кода (контекст), где вызывается проблемный запрос MSSQL.
2. Станет понятно какой пользователь его вызывает и какая строка кода.
3. Правильнее всего подключиться к сеансу этого пользователя и попросить его повторить те предполагаемые действия, которые связаны с вызовом найденной строки кода.
4. Уже в большинстве случаев станет понятно как воспроизводить проблему
12 TormozIT
 
гуру
19.11.12
00:11
Если (11) невозможно сделать, то можно попробовать половить запросы SDBL. Если они SELECTовые и самодостаточны, то можно попробовать сконвертировать их в обычные запросы и выполнить в консоли запросов для воспроизведения.
13 МихаилМ
 
19.11.12
00:13
(1)
можно если sql2000
путем превращения локальной временной таблицы в глобальную.
в более новых нельзя.
14 H A D G E H O G s
 
19.11.12
00:20
(11) Все уже давно отловлено.
15 H A D G E H O G s
 
19.11.12
00:20
Мне нужен план запроса.
16 TormozIT
 
гуру
19.11.12
00:27
(14) Так если ты можешь ВОСПРОИЗВЕСТИ проблемный запрос, то значит и можешь увидеть план запроса.
17 H A D G E H O G s
 
19.11.12
00:37
(16) построй план запроса вот для такой мелочи

exec sp_executesql N'SELECT TOP 1000 [_IDRRef]
     ,[_Version]
     ,[_Marked]
     ,[_IsMetadata]
     ,[_Code]
     ,[_Description]
 FROM [empty].[dbo].[_Reference14]
 Where _Marked=@p1',N'@P1 varbinary(1)',0x00
18 H A D G E H O G s
 
19.11.12
01:11
ППЦ, дополз
19 H A D G E H O G s
 
19.11.12
01:11
Или я дятел, или этого не может быть
20 H A D G E H O G s
 
19.11.12
01:11
Потому что этого не можут быть
21 H A D G E H O G s
 
19.11.12
01:13
Запрос вида

ЛЕВОЕ СОЕДИНЕНИЕ СчетФактуры КАК СчетФактуры
       ПО ВзаиморасчетыОстаткиИОбороты.Регистратор = СчетФактуры.Регистратор

преобразуется в

INNER JOIN #tt4 T17 WITH(NOLOCK)
ON 1=1

что бред.

Имеем Cross join и полный пизнес...
22 H A D G E H O G s
 
19.11.12
01:13
Из за чего такое может быть?
23 H A D G E H O G s
 
19.11.12
01:15
Воот, еще подтверждуха, что я не гоню. Когда в запрос

ВЫБРАТЬ
   Регистраторы.Регистратор КАК Регистратор,
   СчетФактураВыданныйДокументыОснования.Ссылка КАК СчетФактура
ПОМЕСТИТЬ СчетФактуры
ИЗ
   Регистраторы КАК Регистраторы
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
       ПО Регистраторы.Регистратор = СчетФактураВыданныйДокументыОснования.ДокументОснование

ИНДЕКСИРОВАТЬ ПО
   Регистратор
;

добавляю  ПЕРВЫЕ 1 - ничего в аут не уходит.
24 alexhtn
 
19.11.12
06:40
(2)
SELECT usecounts, cacheobjtype, objtype, text, query_plan, value as set_options
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where text like '%#tt1%'and attribute='set_options'

Выдает список запросов, в нем ищешь свой запрос, открываешь план запроса в хмл виде, сохраняешь, изменяешь расширение на sqlplan, два раза щелкаешь и он открывается в management studio в нормальном виде.
25 ДенисЧ
 
19.11.12
07:23
Перед вами, господа соучастники, поток нетрезвого сознания, как наглядный пример вреда алкоголя (ромикс, приди!)
26 Sammo
 
19.11.12
07:31
(23) Хм. А если сначала во временную Ссылка, документОснование и потом ее сjoin-нить?
Меня несколько смущает данное внутреннее...
+ как получаются Регистраторы?
27 GStiv
 
19.11.12
08:10
(25) Главное не мешать человеку думать, а там и решение найдется
28 H A D G E H O G s
 
19.11.12
11:29
(24) Спасибо тебе, добрый человек
29 H A D G E H O G s
 
19.11.12
12:33
Так. Проблема в том, что SQL не кэширует этот план запроса. Как быть?
30 H A D G E H O G s
 
19.11.12
12:38
(26) Та же херь.

Вообще я ошибся, вчера уже мозг скорее всего не работал...
Все нормально соединяет
LEFT OUTER JOIN #tt4 T13 WITH(NOLOCK)
ON (T1.Recorder_TYPE = T13._Q_001_F_000_TYPE AND T1.Recorder_RTRef = T13._Q_001_F_000_RTRef AND T1.Recorder_RRRef = T13._Q_001_F_000_RRRef)
31 H A D G E H O G s
 
20.11.12
00:57
ms sql profiler рулит и педалит....

О сколько нам открытий чудных несет метод тыка.
32 H A D G E H O G s
 
20.11.12
01:12
Так... Ничего не понимаю. Добавил еще одну таблицу временную, в нее все кидаю из ОстаткиИОбороты регистра и затем уже выполняю соединение со счет фактурами.

Все окей, только.... сервер 1С также виснет, а запросы в SQL останавливаются на выполнении закидки ОстаткиИОбороты во временную. Все нормально запрос отрабатывает, за 4 секунды, а потом все умирает... сервер 1С сжирает 8 гигов и крутиться возле границы памяти... Когда снимаю клиента в консоли сервера 1С, SQL профайлер дает бредовый выполненный запрос вида

SELECT
T1._Q_001_F_000RRef,
T1._Q_001_F_001RRef,
T1._Q_001_F_002RRef,
T1._Q_001_F_003_TYPE,
T1._Q_001_F_003_RTRef,
T1._Q_001_F_003_RRRef,
T1._Q_001_F_008,
T1._Q_001_F_010,
T2._Document516_IDRRef,
T1._Q_001_F_004,
T1._Q_001_F_006,
T1._Q_001_F_005,
T1._Q_001_F_007,
T1._Q_001_F_009,
T1._Q_001_F_011,
T1._Q_001_F_012,
T1._Q_001_F_013,
T1._Q_001_F_014
FROM #tt6 T1 WITH(NOLOCK)
INNER JOIN _Document516_VT14379 T2 WITH(NOLOCK)
ON 1=1

со временем 230 секунд и в конце

kill 59


Что за херня творицца?

Счаст тестирую конфу, но вряд ли, вряд ли.
33 H A D G E H O G s
 
20.11.12
01:13
_Document516_VT14379 -счаст гляну, чье это и почему он к нему cross join делает.
34 H A D G E H O G s
 
20.11.12
01:14
#tt6 - это нормальная ВТ с ОстаткиИОброты.
35 H A D G E H O G s
 
20.11.12
11:54
Никаких ошибок в конфигурации, и в данных - нет.
36 mikecool
 
20.11.12
11:55
(0) будь мужиком, используй exec sp_executesql N'INSERT INTO ##tt2
37 H A D G E H O G s
 
20.11.12
12:05
Счаст буду смотреть различные значения колонки типов
_RecorderTRef

Вдруг че негодное затесалось.
38 H A D G E H O G s
 
20.11.12
12:06
И получилось как у софтпоинтовского МуМу
39 TormozIT
 
гуру
20.11.12
12:20
Какое у тебя значение попало в тип регистратора?
40 H A D G E H O G s
 
20.11.12
12:22
(39) Пока не смотрел
Основная теорема систематики: Новые системы плодят новые проблемы.