Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Два варианта одного и того же запроса. Разное время выполнения  [new]
pmb17
Member

Откуда:
Сообщений: 92
Есть запрос в 1С
ВЫБРАТЬ
	Реализация.Ссылка КАК Ссылка
ПОМЕСТИТЬ втДокументы
ИЗ
	Документ.РеализацияТоваровУслуг КАК РЕализация
ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ЧекККМ.Ссылка
ИЗ
	Документ.ЧекККМ КАК ЧекККМ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	РеализацияТоваровУслугТовары.Ссылка КАК ДокументОтгрузки
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка В
			(ВЫБРАТЬ
				втДокументы.Ссылка
			ИЗ
				втДокументы КАК втДокументы)

который выполняется примерно 2 минуты, в результате запроса выбирается 12 000 записей. При этом практически все время выполнения запроса SQL грузит ЦП под 100%

Если во втором подзапросе наложить условие с помощью внутреннего соединения, то время выполнения меньше 1 сек

ВЫБРАТЬ РАЗЛИЧНЫЕ
	РеализацияТоваровУслугТовары.Ссылка КАК ДокументОтгрузки
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДокументы КАК втДокументы
		ПО (втДокументы.Ссылка = РеализацияТоваровУслугТовары.Ссылка)

В профайлере нашел выполнение запроса

exec sp_executesql N'SELECT DISTINCT
T1._Document512_IDRRef
FROM _Document512_VT13493 T1 WITH(NOLOCK)
WHERE T1._Document512_IDRRef IN
(SELECT
CASE WHEN T2._Q_000_F_000TRef = @P1 THEN T2._Q_000_F_000RRef ELSE 0xFF END AS Q_002_F_000RRef
FROM #tt10 T2 WITH(NOLOCK))',N'@P1 varbinary(4)',0x00000200


с CPU = 180000, duration = 120000, reads = 13000000, writes = 2000, причем для него не было события ShowPlan XML и ShowPlan All

Платформа 1С 8.2, MS SQL 2008 R2

Хотелось бы понять почему так происходит?
12 дек 14, 19:06    [16991020]     Ответить | Цитировать Сообщить модератору
 Re: Два варианта одного и того же запроса. Разное время выполнения  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Показывате текст второго sql-запроса.
12 дек 14, 19:08    [16991026]     Ответить | Цитировать Сообщить модератору
 Re: Два варианта одного и того же запроса. Разное время выполнения  [new]
pmb17
Member

Откуда:
Сообщений: 92
Запрос в профайлере как раз соответствует второму подзапросу

ВЫБРАТЬ РАЗЛИЧНЫЕ
	РеализацияТоваровУслугТовары.Ссылка КАК ДокументОтгрузки
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка В
			(ВЫБРАТЬ
				втДокументы.Ссылка
			ИЗ
				втДокументы КАК втДокументы)


Вопрос почему он в течении почти двух минут вешает сервер?
И почему этого нет если использовать внутреннее соединение?
12 дек 14, 19:10    [16991038]     Ответить | Цитировать Сообщить модератору
 Re: Два варианта одного и того же запроса. Разное время выполнения  [new]
pmb17
Member

Откуда:
Сообщений: 92
Для второго варианта запроса

ВЫБРАТЬ
	Реализация.Ссылка КАК Ссылка
ПОМЕСТИТЬ втДокументы
ИЗ
	Документ.РеализацияТоваровУслуг КАК РЕализация

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ЧекККМ.Ссылка
ИЗ
	Документ.ЧекККМ КАК ЧекККМ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	РеализацияТоваровУслугТовары.Ссылка КАК ДокументОтгрузки
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДокументы КАК втДокументы
		ПО (втДокументы.Ссылка = РеализацияТоваровУслугТовары.Ссылка)


в профайлере есть два запроса и со скоростью все в порядке

exec sp_executesql N'INSERT INTO #tt6 (_INVALUELISTTRef, _INVALUELISTRRef) SELECT
@P1,
T1._IDRRef
FROM _Document512 T1 WITH(NOLOCK)
WHERE (T1._Date_Time > @P2)
UNION SELECT
@P3,
T2._IDRRef
FROM _Document585 T2 WITH(NOLOCK)
WHERE (T2._Date_Time > @P4) AND (T2._Date_Time < @P5)',N'@P1 varbinary(4),@P2 datetime2(3),@P3 varbinary(4),@P4 datetime2(3),@P5 datetime2(3)',0x00000200,'2014-01-01 00:00:00',0x00000249,'2014-10-01 00:00:00','2015-01-01 00:00:00'


(тут еще ограничение по дате наложено, которое в запросе 1С убрал)

И

exec sp_executesql N'SELECT DISTINCT
T1._Document512_IDRRef
FROM _Document512_VT13493 T1 WITH(NOLOCK)
INNER JOIN #tt6 T2 WITH(NOLOCK)
ON (T2._INVALUELISTTRef = @P1 AND T2._INVALUELISTRRef = T1._Document512_IDRRef)',N'@P1 varbinary(4)',0x00000200
12 дек 14, 19:15    [16991054]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить