Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

долго работает хранимая процедура   Найти похожие ветки 

 
SLP ©   (2007-01-17 15:28) [40]


> Павел Калугин ©   (17.01.07 14:47) [39]


Послала файл со скриншотами : "Это план запроса для Select и ХП.doc"
Посмотрите, пож-та.


 
Павел Калугин ©   (2007-01-17 15:41) [41]

> [40] SLP ©   (17.01.07 15:28)

куда?


 
Bless ©   (2007-01-17 15:55) [42]


> SLP ©   (17.01.07 15:28) [40]
>
> Послала файл со скриншотами : "Это план запроса для Select
> и ХП.doc"
>


Куда послала-то? И еще выложи, если не трудно, еще и "неудобный" csv-файл.
По картинкам ориентироваться конечно удобнее, но я как-то подозреваю, что план в ширину у тебя не влез в один экран, что неудобно. Да и клацнув мышкой по пиктограмме на скриншоте, дополнительная информация у меня не всплывет, как у тебя в Analizer-е. А в "неудобном" файле это все есть. :)
Может, это и не понадобится, но паузы между твоими появлениями тут довольно велики, поэтому на всякий случай прошу все сразу.

И еще, напиши, сколько записей в каждой из таблиц, участвующих в запросе.


 
SLP ©   (2007-01-17 15:56) [43]

зашла на http://slil.ru/  - получился http://zalil.ru/, набрала browse - выбрала свой файл - и Send. Куда ушел мой файл я не знаю. Может что не так сделала?


 
SLP ©   (2007-01-17 15:59) [44]


> Bless ©   (17.01.07 15:55) [42]

Сейчас подготовлю. Спасибо. Паузы - это работы другой много...


 
Bless ©   (2007-01-17 16:06) [45]

после того, как залила, у тебя вверху страницы (у меня в Опере в добавок и в адресной строке тоже) будет адрес типа
http://slil.ru/23762505
Вот его сюда и скажи


 
SLP ©   (2007-01-17 16:16) [46]


> Bless ©   (17.01.07 16:06) [45]

http://slil.ru/23762556 - здесь .CVS
http://slil.ru/23762577  - десь док с скриншотами, выложила их по-порядку, поэтому понятно будет, т.к. не умещающиеся рисунки сделала с повторением по краям.
В табл start_ssd - около 270000  зап.
В табл ves- 1971 записей. Это справочник судов.


 
Павел Калугин ©   (2007-01-17 16:44) [47]

> [46] SLP ©   (17.01.07 16:16)

гут вечерком дома попробую смоделировать


 
SLP ©   (2007-01-17 16:51) [48]


> ел Калугин ©   (17.01.07 16:44) [47]


Спасибо. Только жаль Ваше время


 
Bless ©   (2007-01-17 17:05) [49]

в CSV и на картинках - разные планы выполнения. В CSV они одинаковы и для запроса, и для хранимки. А на картинке - разные.
К тому же, на картинках у тебя написано, что хранимка выполняется 5-8 мин. А судя по плану она занимает 0.08% от времени выполнения. Т.е. выполняется ГОРАЗДО быстрее запроса. Так что я думаю, твое утверждение "хранимка -5 мин, запрос - 2 сек" - неверно.
Вероятнее, что ты выполняла запрос непосредственно сразу после хранимки, я прав?
Подозреваю, что выполни ты запрос первым, а хранимку - сразу вслед за ним, получила бы противоположный результат (о чем план в картинках и говорит).
Я хочу сказать, что 2 секунды, может быть, получились из-за того, что сервер кешировал данные или что-то в этом духе (я не шибко силен) и этот результат - "нечестный" и запорачиваться по поводу "почему большая разница" не стоит.  
А вот по поводу, "почему аж 5 мин" - стоим, имхо.

Что касается запроса:
поле start_ssd.id_ssd случайно не ключевое? Если да, то тогда (если я не ошибаюсь) один start_ssd из запроса можно выбросить:
select rtrim(ves.iki_ves)+" "+ rtrim(ves.board_number)+" "+rtrim(ves.ves) as name_ves,cast(convert(char(10),
a.datetime,102) as datetime) as ssd_data,
datediff(day,a.datetime,cast(convert(char(10),a.ssd_mail,102) as datetime))-1 as day_r,a.id_ssd, a.id_ves, a.ssd_mail
from start_ssd a
join ves on a.id_ves=ves.id_ves
where a.ssd_mail>=@d_mail
and a.ssd_mail<=@d_mail2
and a.processstatus  not in (1,11)
and a.mem in (21,31)
and a.id_ves<>0
and  datediff(day,a.datetime,a.ssd_mail)>=2
and not exists
(select id_ssd
from start_ssd
where id_ves=a.id_ves
and datetime=a.datetime
and ssd_mail<a.ssd_mail)
order by a.ssd_data, a.id_ves


 
Bless ©   (2007-01-17 17:16) [50]

Попробуй запрос из [49]. Результат работы должен быть таким же, как и старого запроса.  А вот скорость... неуверен, но уж точно не медленнее.


 
SLP ©   (2007-01-17 17:22) [51]


> Bless ©   (17.01.07 17:05) [49]


Нет, первым я выполняла запрос, вторым ХП. На самом деле запрос -= 2 сек, ХП - вертится от 5 до 8 мин.
id_ssd - ключевое.  С Вашим вариантом согласна.
Завтра с утра еще посмотрю планы запросов, но по - моему я все правильно послала. Сейчас домой надо идти.


 
SLP ©   (2007-01-17 17:24) [52]

SLP ©   (17.01.07 17:22) [51]

> Bless ©   (17.01.07 17:05) [49]

Нет, первым я выполняла запрос, вторым ХП. На самом деле запрос -= 2 сек, ХП - вертится от 5 до 8 мин.
id_ssd - ключевое.  С Вашим вариантом согласна.
Завтра с утра еще посмотрю планы запросов, но по - моему я все правильно послала. Сейчас домой надо идти.


 
Bless ©   (2007-01-17 17:36) [53]


> Нет, первым я выполняла запрос, вторым ХП.


Я имел ввиду не когда ты проверяла текст из [15], а когда создавала ветку
У меня хранимая процедура на сервере отрабатывает около 5 мин. Помещаю этот же самый запроc в QA и он отрабатывает за 2 сек.

тут ты сначала выполняла запрос, а вторым ХП?


>  На самом деле запрос -= 2 сек, ХП - вертится от 5 до 8
> мин.


Судя по плану, все с точностью до наоборот:
на 1-ом скриншоте:
Query3: Query cost (relative to the batch): 99.92%
Query text: select rtrim(ves.iki_ves)+" "+ rtrim(ves.board_number)+....


на 4-ом скриншоте:
Query 4: Query cost (relative to the batch): 0.08%
Query text: exec [ssd_delayed_period] @d_mail, @d_mail2


И раз уж согласна с моим вариантом, то выполни новый запрос (только запрос, без ХП) и скинь план пожалуйста (уже завтра, конечно).

<OFFTOP>
Ничего, что я "Ты-каю"?
</OFFTOP>


 
b z   (2007-01-17 18:03) [54]

попробуйте так

http://dotnetslackers.com/SQL/re-38060_SQL_Server_Query_Analyzer_Runs_Fast_Stored_Procedure_Runs_Slow.aspx


 
SLP ©   (2007-01-18 10:23) [55]


> Bless ©   (17.01.07 17:36) [53]


Приготовила Вам планы запросов с одним start_ssd. Хотела послать, но перед этим решила проверить как будет работать ХП с одним start_ssd.
Время выполнения 1 Сек!!!!
Так что дело в запросе, а не в сервере.
Виталий, большое Вам спасибо за внимание и помощь!
Павел! Вам тоже большое спасибо!


 
Bless ©   (2007-01-18 11:06) [56]


> SLP ©   (18.01.07 10:23) [55]
>
> Время выполнения 1 Сек!!!!


Откровенно говоря, даже не рассчитывал, что так легко все разрешится. :)
Ну да хорошо все, что хорошо кончается.


 
Павел Калугин ©   (2007-01-18 13:05) [57]

Да вроде не за что. Хорошо то, что хорошо кончается...


 
SLP ©   (2007-01-19 09:39) [58]


> Bless ©   (17.01.07 17:36) [53]

Окончательный вариант ХП сделала такой:
CREATE PROCEDURE [dbo].[ssd_delayed_period2] (@d_mail  datetime, @d_mail2  datetime ) AS
-----Опоздавшие ССД за конкретный период
-----ССД, пришедшие на замену,  опоздавшими не считаются.
------EXEC DBO.SSD_DELAYED_period2   "20070101","20070115"

BEGIN
select * into #start_ssd from start_ssd where  mem in (21,31) and id_ves<>0
select rtrim(ves.iki_ves)+" "+ rtrim(ves.board_number)+" "+rtrim(ves.ves) as name_ves,cast(convert(char(10),
a.datetime,102) as datetime) as ssd_data,
datediff(day,a.datetime,cast(convert(char(10),a.ssd_mail,102) as datetime))-1 as day_r,a.id_ssd, a.id_ves, a.ssd_mail
from #start_ssd a  
join ves on a.id_ves=ves.id_ves
where a.ssd_mail>=@d_mail
and a.ssd_mail<=@d_mail2
and a.processstatus  not in (1,11)
---and a.mem in (21,31)
---and a.id_ves<>0
and  datediff(day,a.datetime,a.ssd_mail)>=2
and not exists
(select id_ssd
from #start_ssd
where id_ves=a.id_ves
and datetime=a.datetime
and ssd_mail<a.ssd_mail)
order by a.ssd_data, a.id_ves

drop table #start_ssd

END
GO

Запустила последний раз в 9-00,в самое напряженное время, когда start_ssd эксплуатируется оч. напряженно, в нее постоянно добавляются и редактируются  записи. ( эта табл весь раб день так занята операторами).
С вариантом, сначала временной табл., ХП  отрабатывает за 10 сек.
С вариантом напрямую к start_ssd - крутится более 3 мин и я снимаю, чтобы не тормозить работу операторов.


 
Павел Калугин ©   (2007-01-19 10:36) [59]

> [58] SLP ©   (19.01.07 09:39)

ребята из Диасофта очень любят, дабы избежать блокировок, использовать конструкцию from table_name (NOLOCK), и так далее при выборке данных. Помогает, однако..


 
MsGuns ©   (2007-01-20 13:12) [60]

QA ВСЕГДА выполняет запрос быстрее, чем "обертка"+Jet
И было бы странно, если бы было наоборот ;)


 
SLP ©   (2007-01-22 08:50) [61]


> MsGuns ©   (20.01.07 13:12) [60]


Да. Но у меня эта ХП вставлена и в прогр на Delphi (компонент ADOStoredProc1). Так же долго выполнялась. Но посл. вариант через # стала выполняться в 3 раза быстрее...Пока так.


 
Bless ©   (2007-01-22 12:17) [62]


> Запустила последний раз в 9-00,в самое напряженное время,
>  когда start_ssd эксплуатируется оч. напряженно, в нее постоянно
> добавляются и редактируются  записи. ( эта табл весь раб
> день так занята операторами).
> С вариантом, сначала временной табл., ХП  отрабатывает за
> 10 сек.
> С вариантом напрямую к start_ssd - крутится более 3 мин
> и я снимаю, чтобы не тормозить работу операторов.
>


хранимка, запущенная в 9-00 и просто запрос из QA, запущенный в это же время, отрабатывают одинаково долго? Или запрос, как и раньше, на пару порядков быстрее и имеет другой план выполнения?
Если все, как и раньше, то:

1)
может быть, совет из [54] - то, что нужно?
Более подробно этот вопрос (из [54]) освещен в статье
http://www.sql.ru/articles/mssql/2005/070704TechniqueForEnsuringPlanStabilityInSQLServer2000.shtml

2) сделай exec sp_recompile ssd_delayed_period и опять выполни запрос и хранимку с одинаковыми параметрами. Желательно делать это на копии базы, чтоб быть уверенным, что между sp_recompile и твоим вызовом хранимки не было вызова хранимки, инициированного каким-то пользователем (хотя если сделать все в одном батче ...exec sp_recompile... exec ssd_delayed_period... select, то вероятность этого будет невысокой наверное). Если и теперь планы выполнения будут разными, то я даже не знаю...
Если же планы стали одинаковыми, то, видимо, совет из [54] - таки хорош.

Если все вышесказанное - не подходит, то еще вопрос:
хранимка, запущенная не в час пик, отрабатывает так же долго?

По поводу хранимки со временной таблицей:

Может быть, я ошибаюсь, но я не вижу причин, по которым введение временной таблицы ускоряет выполнение твоей хранимки, состоящей из одного запроса. Не должно быть такой огромной разницы между вариантами с временной таблицей и без нее.
И блокировки таблицы start_ssd из-за активной работы тут ни при чем, имхо.
(Соответственно, опять же имхо, NOLOCK проблему не решит).
Ведь если запрос без # не может быстро отработать из-за блокировок, то заполнить временную таблицу ты тоже не смогла бы по причине этих же самых блокировок. А раз с этим проблем нет, то, видимо, дело не в блокировках start_ssd.


 
SLP ©   (2007-01-22 14:58) [63]


> Bless ©   (22.01.07 12:17) [62]

Я запускала ХП, когда таблицу  уже никто не дергал. Отрабатывает также долго, как и в час пик. С # отрабатывает быстро, в час пик около 1 мин.
Дело в том, что start_ssd связана по id_ssd c 25 таблицами, которые  в свою очередь связаны с справочниками. И получается, что когда я делаю сначала #start_ssd, а потом  выполняется select, то #start_ssd уже чистенькая, без наследства в виде 25 табл + справочники.... Она забыла все свои связи.
Выходит так...
Всем спасибо.


 
Bless ©   (2007-01-22 15:40) [64]

SLP ©   (22.01.07 14:58) [63]


> Я запускала ХП, когда таблицу  уже никто не дергал. Отрабатывает
> также долго, как и в час пик.


А просто запрос в Query Analizer-е тоже медленно работает? Или быстро? Меня очень интересует, осталась ли старая проблема, с которой начиналась эта ветка?


> С # отрабатывает быстро, в час пик около 1 мин.
> Дело в том, что start_ssd связана по id_ssd c 25 таблицами,
>  которые  в свою очередь связаны с справочниками. И получается,
>  что когда я делаю сначала #start_ssd, а потом  выполняется
> select, то #start_ssd уже чистенькая, без наследства в виде
> 25 табл + справочники.... Она забыла все свои связи.
> Выходит так...


Во-первых, все связи с прочими таблицами при селекте никак не мешают, имхо.
А во-вторых, даже если б они мешали, то логически рассуждая, непонятно, почему сделать селект, нужный тебе, связи мешают, а сделать селект из этой же обвешанной связями таблицы во временную таблицу - не мешают.

В общем, тебе, конечно, решать, оставить все как есть или нет.
Но, имхо, эта ситуация (когда с # быстрее чем без) странная, и ее бы надо разрулить, а не обойти, всяко полезно на будущее.
Кроме того, 1 мин для запроса к таблицам твоих объемов - это неоправданно долго, на мой взгляд.


 
ЮЮ ©   (2007-01-23 07:09) [65]

Скорей всего без # идет полное сканирование таблицы, а при выборке в # используется более простое условие, поэтому возможно работают уже и индексы.  Из-за меньшего объема данных в # запрос работает тоже быстрее, даже невзирая на полное отсутстви индексов у #.


 
SLP ©   (2007-01-23 09:06) [66]


> Bless ©   (22.01.07 15:40) [64]
> Меня очень интересует, осталась ли старая проблема, с которой
> начиналась эта ветка?

Проблема осталась, причем старая процедура (без #) работает также долго как в час пик, так и тогда когда табл никто не дергает уже. Единственный раз, когда админ перезагружал  сервер и были сняты все задачи, я неск раз запустила ХП (без #)  и она отработала за 1 сек.
Сейчас с # отрабатывает быстро, в час пик около мин, в ост время 15 сек.
После всех этих практических проб, я все таки пришла к выводу, что при select-e такие обремененные табл тянут за собой все связи,  лучше делать с #. Но я нигде этого не читала, это чисто практически, может я не права...


 
Bless ©   (2007-01-23 09:50) [67]


> После всех этих практических проб, я все таки пришла к выводу,
>  что при select-e такие обремененные табл тянут за собой
> все связи,  лучше делать с #. Но я нигде этого не читала,
>  это чисто практически, может я не права...


Я на 99% уверен, что ты ошибаешься (1 % оставляю на "в мире нет ничего невозможного", на "человеку (мне) свойственно ошибаться" и на непредсказуемое влияние пятен на солнце на земную жизнь).

Посуди сама: раз старая проблема осталась (т.е. просто запрос в QA выполняется быстро, а аналогичная ХП - медленно), то как твой вывод с этим согласуется?  Почему просто select быстро отрабатывает? Все связи ж остаются.

Совет из  [54] пробовала?


 
SLP ©   (2007-01-23 09:58) [68]


> ess ©   (23.01.07 09:50) [67]

54 еще не пробовала. Попробую обязательно. Напишу попозже, завтра.


 
Bless ©   (2007-01-23 10:28) [69]


> ess [67]


Хорошо, что я не выбрал себе ник Blass :)


 
SLP ©   (2007-01-24 09:29) [70]


> Bless ©   (23.01.07 09:50) [67]

54 попробовала. Сделала параметры так как в http://www.sql.ru/articles/mssql/2005/070704TechniqueForEnsuringPlanStabilityInSQLServer2000.shtml Сделала все как в статье, запускала и первоначально с 2007 годом, с параметрами определенными внутри ХП.
Не помогло, все также, ХП (из QA) без # работает около 6 мин. Запускала подряд неск раз. Это среднее время.
Из QA одновременно запускала select, отрабатывал 10-15 сек, ХП с # тоже около 15 сек. Так что не знаю, что там думает оптимизатор, но может новая версия SP к MSSQL поможет.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.048 c
2-1175082478
Alex_C
2007-03-28 15:47
2007.04.15
Видимость переменных


5-1151662140
Shuric
2006-06-30 14:09
2007.04.15
ReadComponent


15-1174368163
Calibr
2007-03-20 08:22
2007.04.15
JavaScript


15-1174554995
Andy BitOff
2007-03-22 12:16
2007.04.15
А кто что может сказать про Debian?


2-1175013602
Comp
2007-03-27 20:40
2007.04.15
Как обработать сообщение WM_PAINT для Edit-а?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский