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

Откуда:
Сообщений: 39
Есть MS SQL 2005 SP2 и платформа 1С 8.1.14, есть запрос с соединениями таблиц. Текст запроса могу привести если нужно, он не маленький. Так вот один и тот же запрос может в одном сеансе отработать за секунды, а в другом подвиснуть минут на 40 или на несколько часов, при этом процесс sqlservr отжирает до 40% процессорного времени. Куда копать?
27 окт 09, 16:47    [7845654]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Блокировки?
27 окт 09, 17:06    [7845804]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13148
не факт что блокировки, хотя и вероятно. возможно "то самое" поведение 2005 когда "извращаются" платы, крутится CPU стоит на месте IO для процесса..
ловить такое поведение и переписывать запрос или сбивать его план индексами / статистиками
27 окт 09, 20:08    [7846588]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
В конфе 1С активно задействован механизм управляемых блокировок. Проблемы с конкурентным доступом по записи нет вообще. Зависание возникает при работе с отчетом, т.е. по чтению данных. Возникает именно при больших выборках, например отчет за год или более. При этом запрос гарантированно отрабатывается только в одном случае за 5-7 секунд в другом за 3-4 часа в третем за 40 минут с чем связано непонятно. Во всех случаях условия выборки и объем обрабатываемых данных одинаков.
27 окт 09, 22:43    [7846899]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
up
28 окт 09, 13:58    [7850016]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Мы текст запроса и его планы в обоих случаях увидим когда-нибудь?
28 окт 09, 14:00    [7850027]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
Вот запрос генерируемый 1С-кой, вытащен из профайлера:



SELECT
#V8TblAli1_Q_000_T_001._Fld642Turnover AS f_3,
#V8TblAli1_Q_000_T_001._Fld2013Turnover AS f_4,
#V8TblAli1_Q_000_T_001._Fld646Turnover - #V8TblAli1_Q_000_T_001._Fld1981Turnover AS f_5,
CAST(#V8TblAli2_Q_000_T_002._Q_002_F_003 AS NUMERIC(21,8)) * #V8TblAli1_Q_000_T_001._Fld642Turnover * ISNULL(#V8TblAli3_Q_000_T_003._Fld267, CAST(0. AS NUMERIC(1,0))) / CAST(1 AS NUMERIC(1,0)) + #V8TblAli1_Q_000_T_001._Fld1787Turnover + #V8TblAli1_Q_000_T_001._Fld2013Turnover AS f_6,
_Reference8._OwnerIDRRef AS f_7,
_Reference4._Folder AS _sf_1,
_Reference4._Description AS _sf_2,
_Reference4._IDRRef AS _sf_3RRef

FROM
( SELECT DATEADD(DAY, DATEPART(DAY, _AccumReg633._Period) - 1, DATEADD(MONTH, DATEPART(MONTH, _AccumReg633._Period) - 1, DATEADD(YEAR, DATEPART(YEAR, _AccumReg633._Period) - 2000, {ts '2000-01-01 00:00:00'}))) AS _DayPeriod,
_AccumReg633._Fld634RRef AS _Fld634RRef,
_AccumReg633._Fld637RRef AS _Fld637RRef,
_AccumReg633._Fld635RRef AS _Fld635RRef,
CAST(SUM(_AccumReg633._Fld646) AS NUMERIC(21,2)) AS _Fld646Turnover,
CAST(SUM(_AccumReg633._Fld1787) AS NUMERIC(21,2)) AS _Fld1787Turnover,
CAST(SUM(_AccumReg633._Fld642) AS NUMERIC(21,3)) AS _Fld642Turnover,
CAST(SUM(_AccumReg633._Fld1981) AS NUMERIC(21,3)) AS _Fld1981Turnover,
CAST(SUM(_AccumReg633._Fld2013) AS NUMERIC(21,2)) AS _Fld2013Turnover

FROM
_AccumReg633 WITH(NOLOCK)

WHERE _AccumReg633._Period >= @P1 AND _AccumReg633._Period <= @P2 AND _AccumReg633._Active = @P3

GROUP BY
DATEADD(DAY, DATEPART(DAY, _AccumReg633._Period) - 1, DATEADD(MONTH, DATEPART(MONTH, _AccumReg633._Period) - 1, DATEADD(YEAR, DATEPART(YEAR, _AccumReg633._Period) - 2000, {ts '2000-01-01 00:00:00'}))), _AccumReg633._Fld634RRef, _AccumReg633._Fld637RRef, _AccumReg633._Fld635RRef HAVING CAST(SUM(_AccumReg633._Fld646) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1787) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld642) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1981) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld2013) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) ) #V8TblAli1_Q_000_T_001 LEFT OUTER JOIN _Reference8 WITH(NOLOCK) ON #V8TblAli1_Q_000_T_001._Fld637RRef = _Reference8._IDRRef LEFT OUTER JOIN _Reference9 WITH(NOLOCK) ON #V8TblAli1_Q_000_T_001._Fld635RRef = _Reference9._IDRRef

LEFT OUTER JOIN _Reference487 WITH(NOLOCK) ON _Reference9._Fld41RRef = _Reference487._IDRRef

LEFT OUTER JOIN
(
SELECT #V8TblAli1_Q_002_T_001._Q_001_F_000RRef AS _Q_002_F_000RRef,
#V8TblAli1_Q_002_T_001._Q_001_F_001 AS _Q_002_F_001,
_InfoReg589_Q_002_T_002._Fld590RRef AS _Q_002_F_002RRef,
MAX(ISNULL(_InfoReg589_Q_002_T_002._Fld592, CAST(0. AS NUMERIC(1,0)))) AS _Q_002_F_003

FROM (

SELECT
#V8TblAli1_Q_001_T_001._Fld637RRef AS _Q_001_F_000RRef,
DATEADD(SECOND, 59, DATEADD(MINUTE, 59, DATEADD(HOUR, 23, DATEADD(DAY, DATEPART(DAY, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(MONTH, DATEPART(MONTH, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(YEAR, DATEPART(YEAR, #V8TblAli1_Q_001_T_001._DayPeriod) - 2000, {ts '2000-01-01 00:00:00'})))))) AS _Q_001_F_001, MAX(_InfoReg589_Q_001_T_002._Period) AS _Q_001_F_002 FROM ( SELECT DATEADD(DAY, DATEPART(DAY, _AccumReg633._Period) - 1, DATEADD(MONTH, DATEPART(MONTH, _AccumReg633._Period) - 1, DATEADD(YEAR, DATEPART(YEAR, _AccumReg633._Period) - 2000, {ts '2000-01-01 00:00:00'}))) AS _DayPeriod,
_AccumReg633._Fld634RRef AS _Fld634RRef,
_AccumReg633._Fld637RRef AS _Fld637RRef,
CAST(SUM(_AccumReg633._Fld642) AS NUMERIC(21,3)) AS _Fld642Turnover,
CAST(SUM(_AccumReg633._Fld643) AS NUMERIC(21,3)) AS _Fld643Turnover,
CAST(SUM(_AccumReg633._Fld2880) AS NUMERIC(21,3)) AS _Fld2880Turnover,
CAST(SUM(_AccumReg633._Fld644) AS NUMERIC(21,2)) AS _Fld644Turnover,
CAST(SUM(_AccumReg633._Fld645) AS NUMERIC(21,2)) AS _Fld645Turnover,
CAST(SUM(_AccumReg633._Fld646) AS NUMERIC(21,2)) AS _Fld646Turnover,
CAST(SUM(_AccumReg633._Fld647) AS NUMERIC(21,2)) AS _Fld647Turnover,
CAST(SUM(_AccumReg633._Fld1787) AS NUMERIC(21,2)) AS _Fld1787Turnover,
CAST(SUM(_AccumReg633._Fld1788) AS NUMERIC(21,2)) AS _Fld1788Turnover,
CAST(SUM(_AccumReg633._Fld1981) AS NUMERIC(21,3)) AS _Fld1981Turnover,
CAST(SUM(_AccumReg633._Fld1982) AS NUMERIC(21,3)) AS _Fld1982Turnover,
CAST(SUM(_AccumReg633._Fld2013) AS NUMERIC(21,2)) AS _Fld2013Turnover,
CAST(SUM(_AccumReg633._Fld2014) AS NUMERIC(21,2)) AS _Fld2014Turnover

FROM
_AccumReg633 WITH(NOLOCK)

WHERE
_AccumReg633._Period >= @P1 AND _AccumReg633._Period <= @P2 AND _AccumReg633._Active = @P3 GROUP BY DATEADD(DAY, DATEPART(DAY, _AccumReg633._Period) - 1, DATEADD(MONTH, DATEPART(MONTH, _AccumReg633._Period) - 1, DATEADD(YEAR, DATEPART(YEAR, _AccumReg633._Period) - 2000, {ts '2000-01-01 00:00:00'}))), _AccumReg633._Fld634RRef, _AccumReg633._Fld637RRef HAVING CAST(SUM(_AccumReg633._Fld642) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld643) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld2880) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld644) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld645) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld646) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld647) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1787) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1788) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1981) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld1982) AS NUMERIC(21,3)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld2013) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) OR CAST(SUM(_AccumReg633._Fld2014) AS NUMERIC(21,2)) <> CAST(@P4 AS NUMERIC(1,0)) ) #V8TblAli1_Q_001_T_001

LEFT OUTER JOIN
_InfoReg589 _InfoReg589_Q_001_T_002 WITH(NOLOCK) ON _InfoReg589_Q_001_T_002._Period <= DATEADD(SECOND, 59, DATEADD(MINUTE, 59, DATEADD(HOUR, 23, DATEADD(DAY, DATEPART(DAY, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(MONTH, DATEPART(MONTH, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(YEAR, DATEPART(YEAR, #V8TblAli1_Q_001_T_001._DayPeriod) - 2000, {ts '2000-01-01 00:00:00'})))))) AND _InfoReg589_Q_001_T_002._Fld591RRef = #V8TblAli1_Q_001_T_001._Fld637RRef
WHERE #V8TblAli1_Q_001_T_001._Fld634RRef IN (SELECT #tt1._REFFIELDRRef AS f_2 FROM #tt1 WITH(NOLOCK))
GROUP BY #V8TblAli1_Q_001_T_001._Fld637RRef, DATEADD(SECOND, 59, DATEADD(MINUTE, 59, DATEADD(HOUR, 23, DATEADD(DAY, DATEPART(DAY, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(MONTH, DATEPART(MONTH, #V8TblAli1_Q_001_T_001._DayPeriod) - 1, DATEADD(YEAR, DATEPART(YEAR, #V8TblAli1_Q_001_T_001._DayPeriod) - 2000, {ts '2000-01-01 00:00:00'})))))) ) #V8TblAli1_Q_002_T_001

LEFT OUTER JOIN
_InfoReg589 _InfoReg589_Q_002_T_002 WITH(NOLOCK) ON _InfoReg589_Q_002_T_002._Period = #V8TblAli1_Q_002_T_001._Q_001_F_002 AND _InfoReg589_Q_002_T_002._Fld591RRef = #V8TblAli1_Q_002_T_001._Q_001_F_000RRef GROUP BY #V8TblAli1_Q_002_T_001._Q_001_F_000RRef, #V8TblAli1_Q_002_T_001._Q_001_F_001, _InfoReg589_Q_002_T_002._Fld590RRef ) #V8TblAli2_Q_000_T_002 ON #V8TblAli2_Q_000_T_002._Q_002_F_001 = DATEADD(SECOND, 59, DATEADD(MINUTE, 59, DATEADD(HOUR, 23, DATEADD(DAY, DATEPART(DAY, #V8TblAli1_Q_000_T_001._DayPeriod) - 1, DATEADD(MONTH, DATEPART(MONTH, #V8TblAli1_Q_000_T_001._DayPeriod) - 1, DATEADD(YEAR, DATEPART(YEAR, #V8TblAli1_Q_000_T_001._DayPeriod) - 2000, {ts '2000-01-01 00:00:00'})))))) AND #V8TblAli2_Q_000_T_002._Q_002_F_000RRef = #V8TblAli1_Q_000_T_001._Fld637RRef AND #V8TblAli2_Q_000_T_002._Q_002_F_002RRef = _Reference9._Fld41RRef LEFT OUTER JOIN ( SELECT _InfoReg265_IR2._Fld267 AS _Fld267, _InfoReg265_IR2._Fld266RRef AS _Fld266RRef FROM ( SELECT _InfoReg265._Fld266RRef AS _Fld266RRef, MAX(_InfoReg265._Period) AS _MAXPERIOD FROM _InfoReg265 WITH(NOLOCK)
WHERE _InfoReg265._Period <= @P2
GROUP BY _InfoReg265._Fld266RRef ) #V8TblAli1_IR1 INNER JOIN _InfoReg265 _InfoReg265_IR2 WITH(NOLOCK) ON #V8TblAli1_IR1._Fld266RRef = _InfoReg265_IR2._Fld266RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoReg265_IR2._Period ) #V8TblAli3_Q_000_T_003 ON #V8TblAli3_Q_000_T_003._Fld266RRef = _Reference487._Fld488RRef LEFT OUTER JOIN _Reference4 WITH(NOLOCK) ON _Reference8._OwnerIDRRef = _Reference4._IDRRef WHERE #V8TblAli1_Q_000_T_001._Fld634RRef IN (SELECT #tt2._REFFIELDRRef AS f_1 FROM #tt2 WITH(NOLOCK)) ORDER BY _Reference4._Folder, _Reference4._Description, _Reference4._IDRRe
28 окт 09, 14:49    [7850437]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Albatross
Member

Откуда:
Сообщений: 997
О ужас.
Здесь ещё временные таблицы используются, что усложняет задачу оптимизации.
А что выводит sp_lock когда запрос выполняется долго?
28 окт 09, 17:38    [7851878]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Я уже давно в восхищении: и как только сервер в таких вот запросах разбирается?

По всему видать - крутые ребята в этой самой 1С сидят!
Случайно взгляд остановился на фрагменте, где зачем-то прибавляется 23 часа, потом 59 минут, потом 59 секунд...
Не ходят они на наш форум, однако!
Это, наверно, чтобы время в DATETIME учесть при сравнении в ON у JOINа.
Красота необыкновенная! Кругом NOLOCKи стоят! И - тишина...

Кстати, NOLOCKи говорят за то, что с блокировками-то проблем вроде быть не должно.
28 окт 09, 17:56    [7851991]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Crimean
Member

Откуда:
Сообщений: 13148
iap
Я уже давно в восхищении: и как только сервер в таких вот запросах разбирается?


там "построитель отчетов". зато пользователю удобно. а проблемы производительности решают железом
28 окт 09, 18:19    [7852105]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Crimean
iap
Я уже давно в восхищении: и как только сервер в таких вот запросах разбирается?


там "построитель отчетов". зато пользователю удобно. а проблемы производительности решают железом
Это понятно. Непонятно, что мешает поправить этот построитель? Ведь это проще, чем если бы ошибка была "размазана" по тысяче запросов.
Например, документы (или что у них там), датированные последней секундой периода (на несколько миллисекунд больше), просто не рассматриваются!
Мелочь? Как сказать...

Это я по приведённому здесь запросу сужу.
28 окт 09, 20:38    [7852485]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
Как уже говорилось выше скорость работы запроса вполне устраивает, непонятно поведение SQL сервера который может 40 раз отработать запрос почти мгновенно потом уйти в многочасовую задумчивость. Что делать то? Где что оптимизировать или как узнать узкое место...
29 окт 09, 18:28    [7858630]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Air777
Как уже говорилось выше скорость работы запроса вполне устраивает, непонятно поведение SQL сервера который может 40 раз отработать запрос почти мгновенно потом уйти в многочасовую задумчивость. Что делать то? Где что оптимизировать или как узнать узкое место...
Радуйтесь, что он целых 40 раз выполняет то, что вы гордо называете запросом.
29 окт 09, 18:30    [7858640]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
Гавриленко Сергей Алексеевич
Радуйтесь, что он целых 40 раз выполняет то, что вы гордо называете запросом.


Радуюсь, ну а кроме понтов чтото по существу скажите?
29 окт 09, 20:23    [7859023]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
up
30 окт 09, 22:48    [7865343]     Ответить | Цитировать Сообщить модератору
 Re: Зависает запрос  [new]
Air777
Member

Откуда:
Сообщений: 39
up
6 ноя 09, 23:15    [7895103]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить