Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Здравствуйте, пишу первый раз, просьба извинить если что не так.


Запрос:

SELECT T1._Fld11345 FROM _AccumRg10557 T1 WITH(NOLOCK) 
WHERE (NOT ((T1._Fld11345 IN 
(SELECT (T2._Fld11345 + 1) AS Q_001_F_000_ FROM _AccumRg10557 T2 
WITH(NOLOCK) WHERE (T1._Fld11345 = (T2._Fld11345 + 1)))))) 
GROUP BY T1._Fld11345

выполняется за 3 секунды.

То же самое,

exec sp_executesql N'SELECT T1._Fld11345 FROM _AccumRg10557 T1 WITH(NOLOCK) WHERE (NOT ((T1._Fld11345 IN (SELECT
(T2._Fld11345 + @P1) AS Q_001_F_000_ FROM _AccumRg10557 T2 WITH(NOLOCK) WHERE (T1._Fld11345 = (T2._Fld11345 + @P1)))))) GROUP BY T1._Fld11345', N'@P1 numeric(1,0)', 1

но с sp_executesql виснет. Я его прерываю через час. Пользоваться первым запросом не могу, так второй запрос - запрос из "волшебного" 1с.
Есть ли возможность обойти этот момент с параметризацией или переписав запрос, чтобы он был без параметров или в настройках MS SQl что-то поменять?


Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)



USE [Buh8]
GO
/****** Object:  Table [dbo].[_AccumRg10557]    Script Date: 11/30/2011 12:44:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[_AccumRg10557](
	[_Period] [datetime] NOT NULL,
	[_RecorderTRef] [binary](4) NOT NULL,
	[_RecorderRRef] [binary](16) NOT NULL,
	[_LineNo] [numeric](9, 0) NOT NULL,
	[_Active] [binary](1) NOT NULL,
	[_RecordKind] [numeric](1, 0) NOT NULL,
	[_Fld11345] [numeric](10, 0) NOT NULL,
	[_Fld10563RRef] [binary](16) NOT NULL,
	[_Fld10562RRef] [binary](16) NOT NULL,
	[_Fld10564RRef] [binary](16) NOT NULL,
	[_Fld10558RRef] [binary](16) NOT NULL,
	[_Fld10559RRef] [binary](16) NOT NULL,
	[_Fld10560RRef] [binary](16) NOT NULL,
	[_Fld10561RRef] [binary](16) NOT NULL,
	[_Fld10565] [numeric](10, 0) NOT NULL,
	[_Fld10567] [numeric](10, 0) NOT NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
30 ноя 11, 13:54    [11683294]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Перефразирую, sp_executesql тут не причём. Почему виснет это:
DECLARE	@P1	Numeric(1,0) = 1

SELECT	T1._Fld11345
FROM	_AccumRg10557 T1	WITH(NOLOCK) 
WHERE	NOT T1._Fld11345 IN  (
	SELECT	T2._Fld11345 + @P1	AS Q_001_F_000_
	FROM	_AccumRg10557 T2	WITH(NOLOCK)
	WHERE	T1._Fld11345 = T2._Fld11345 + @P1)
GROUP BY T1._Fld11345
30 ноя 11, 14:10    [11683474]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
max11111
"волшебного" 1с
Кактус непотопляем.

По параметризации можете почитать.
30 ноя 11, 14:16    [11683530]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А можно версию 1С? Пжалуста.
30 ноя 11, 14:17    [11683535]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
1c 8.2.14.528
30 ноя 11, 14:19    [11683552]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
По параметризации читал, прочел еще раз но так и не нашел решения как запрос переделать
30 ноя 11, 16:19    [11684664]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
max11111
По параметризации читал, прочел еще раз но так и не нашел решения как запрос переделать
Так вы же запрос переделать не сможете, он же 1С генерится. Так?
Нужно поиграться с параметризацией.

А ещё я не втакал в сам запрос. Там планы нужно смотреть.
30 ноя 11, 20:26    [11686049]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Это Вы Access-ом сделали запрос?

А если так?

SELECT 
           T1._Fld11345 
FROM 
            _AccumRg10557 T1 WITH(NOLOCK)  
            LEFT JOIN _AccumRg10557 T2 WITH(NOLOCK) ON T1._Fld11345 = (T2._Fld11345 + 1)
WHERE
          (T2._Fld11345 + 1) IS NULL
GROUP BY 
          T1._Fld11345
1 дек 11, 03:09    [11687145]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
aleks2
Guest
max11111
По параметризации читал, прочел еще раз но так и не нашел решения как запрос переделать

SELECT	T1._Fld11345
FROM	_AccumRg10557 T1	WITH(NOLOCK) 
WHERE	NOT exists(SELECT	 * FROM	_AccumRg10557 T2 WITH(NOLOCK) WHERE T1._Fld11345-@P1=T2._Fld11345)
GROUP BY T1._Fld11345
Чо, блин, сервер мучить?
1 дек 11, 06:37    [11687225]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Все висит, и первый и второй. Exist правда в 1с нет - менял на NOT 1 IN (SELECT 1 ....)
1 дек 11, 09:18    [11687417]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
max11111,

Так правильно.. Вы ему такое логическое перемножение задаете....
Без ключей... Вы ищите все суммы более суммы +1? По всему регистру...
У Вас 2 000 000 записей умножается на 2 000 000... и пошел поиск...
Ужас
1 дек 11, 09:28    [11687442]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
в два шага
Guest
max11111,

поменяйте на INSERT #tmp SELECT DISTINCT + DELETE #tmp WHERE EXISTS (#tmp where +1)
1 дек 11, 09:32    [11687456]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
в два шага, не понял, можно поподробнее
1 дек 11, 10:14    [11687627]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Volochkova,
так запрос без параметризации в 3 сек отрабатывает
1 дек 11, 10:15    [11687633]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
max11111,

Все равно страшно...

Попробуйте выполнить именно запрос

EXEC ('SELECT T1._Fld11345 FROM _AccumRg10557 T1 WITH(NOLOCK) WHERE (NOT ((T1._Fld11345 IN (SELECT
(T2._Fld11345 + @P1) AS Q_001_F_000_ FROM _AccumRg10557 T2 WITH(NOLOCK) WHERE (T1._Fld11345 = (T2._Fld11345 + 1)))))) GROUP BY T1._Fld11345')

Сколько по времени?
1 дек 11, 10:19    [11687661]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Volochkova, зависло, без параметризации опять 3 секунды, в таблице 1 млн. записей
1 дек 11, 10:36    [11687742]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
max11111
Volochkova, зависло, без параметризации опять 3 секунды, в таблице 1 млн. записей


Что значит
автор
без параметризации
???
Я Вам оставила чистый SQL код.
1 дек 11, 10:49    [11687821]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Вы же в запросе @P1 оставили. Ваш запрос в Studio за 1 мин 11 сек выполнился. Но 1с выдает такой запрос
exec sp_executesql N'SELECT
T1._Fld11345
FROM _AccumRg10557 T1 WITH(NOLOCK)
WHERE (NOT ((T1._Fld11345 IN
(SELECT
(T2._Fld11345 + @P1) AS Q_001_F_000_
FROM _AccumRg10557 T2 WITH(NOLOCK)
WHERE (T1._Fld11345 = (T2._Fld11345 + @P1))))))
GROUP BY T1._Fld11345', N'@P1 numeric(1,0)', 1

а вот он виснет
1 дек 11, 11:03    [11687925]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
max11111,

Простите

EXEC ('SELECT T1._Fld11345 FROM _AccumRg10557 T1 WITH(NOLOCK) WHERE (NOT ((T1._Fld11345 IN (SELECT
(T2._Fld11345 + 1) AS Q_001_F_000_ FROM _AccumRg10557 T2 WITH(NOLOCK) WHERE (T1._Fld11345 = (T2._Fld11345 + 1)))))) GROUP BY T1._Fld11345')

А так?
Тогда 1с текст еще покажите, который такое геренит
1 дек 11, 11:05    [11687941]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 349
1C запрос в студию!
1 дек 11, 11:12    [11687981]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Volochkova,

Текст запроса 1с

ВЫБРАТЬ
	ДвиженияБСО.НомерНачальный
ИЗ
	РегистрНакопления.ДвиженияБСО КАК ДвиженияБСО
ГДЕ
	(НЕ ДвиженияБСО.НомерНачальный В
				(ВЫБРАТЬ
					ДвиженияБСО1.НомерНачальный + 1
				ИЗ
					РегистрНакопления.ДвиженияБСО КАК ДвиженияБСО1
				ГДЕ
					ДвиженияБСО.НомерНачальный = ДвиженияБСО1.НомерНачальный + 1))

СГРУППИРОВАТЬ ПО
	ДвиженияБСО.НомерНачальный
1 дек 11, 11:13    [11687984]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
просто так
Guest
N'@P1 numeric(1,0)'
поменяйте на
N'@P1 numeric(10,0)'
...
поменялось время ?
1 дек 11, 11:13    [11687988]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
просто так,
нет после 5 минут я его сорвал
1 дек 11, 11:22    [11688038]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
max11111
Member

Откуда: Краснодар
Сообщений: 20
Я обрезал базу - оставил одну таблицу с этой колонкой
[url=]http://files.mail.ru/SX0MJY[/url]

Может проблемы в версии MS Sql Server. Я проверял на 2 серверах, но они с одной и той же версией. Может на других пойдет. Если кто может - проверьте пожалуйста запрос

exec sp_executesql N'SELECT
T1._Fld11345
FROM _AccumRg10557 T1 WITH(NOLOCK)
WHERE (NOT ((T1._Fld11345 IN
(SELECT
(T2._Fld11345 + @P1) AS Q_001_F_000_
FROM _AccumRg10557 T2 WITH(NOLOCK)
WHERE (T1._Fld11345 = (T2._Fld11345 + @P1))))))
GROUP BY T1._Fld11345', N'@P1 numeric(1,0)', 1

именно с параметрами
1 дек 11, 17:08    [11691138]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с sp_executesql  [new]
если не секрет
Guest
max11111,

если не секрет, в чем практический смысл запроса?
пробелы в нумерации выдает или что?
1 дек 11, 22:42    [11692869]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить