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

Вниз

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

 
SLP ©   (2007-01-16 12:02) [0]

Добрый день!
У меня хранимая процедура на сервере отрабатывает около 5 мин. Помещаю этот же самый запроc в QA и он отрабатывает за 2 сек. Сервер MSSQL2000, SP поставлен последний.
Помогите пожалуйста советом, куда смотреть ?


 
stone ©   (2007-01-16 12:03) [1]


> Помогите пожалуйста советом, куда смотреть ?

на план выполнения запроса и команды в профайлере


 
SLP ©   (2007-01-16 12:08) [2]


> на план выполнения запроса и команды в профайлере


Не знаю как в хранимой процедуре смотреть план выполнения запроса и команды...
Вот текст ХР

CREATE PROCEDURE [dbo].[ssd_delayed_period] (@d_mail  datetime, @d_mail2  datetime ) AS

------EXEC DBO.SSD_DELAYED "20061205","20061215"

BEGIN
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, start_ssd b  
join ves on b.id_ves=ves.id_ves
where a.ssd_mail>=@d_mail
and a.ssd_mail<=@d_mail2
and a.id_ssd=b.id_ssd
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

END
GO


 
stone ©   (2007-01-16 12:19) [3]


> SLP ©   (16.01.07 12:08) [2]

профайле выдаст тебе команду типа sp_execsql и т.д. с параметрами
вот ее и выполни в аналайзере и посмотри палн выполнения
если будут теже проблемы есть еще ряд ньюансов


 
evvcom ©   (2007-01-16 12:25) [4]

> [2] SLP ©   (16.01.07 12:08)
> from start_ssd a, start_ssd b  
> join ves

ты бы уж определился, то ли ты будешь использовать ключевое слово join, то ли не будешь. А так от твоего винегрета подташнивает.

> and not exists
> (select id_ssd
> from start_ssd

по сути получается, если оптимизатор не сможет ЭТО как то умно переделать, то получится, что для каждого a.id_ves надо серверу выполнить подзапрос, отсюда и тормоза. Попробуй
from start_ssd a
left join start_ssd с
 on c.id_ves=a.id_ves and
    c.datetime=a.datetime and
    c.ssd_mail<a.ssd_mail
where c.id_ves is null

Вместо многократного выполнения подзапроса только join и filter.


 
SLP ©   (2007-01-16 14:40) [5]


> evvcom ©   (16.01.07 12:25) [4]

Попробовала Ваш запрос в QA.
declare @d_mail datetime,@d_mail2 datetime
set @d_mail="20070101"
set @d_mail2="20070115"
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
left join start_ssd c
on c.id_ves=a.id_ves and
   c.datetime=a.datetime and
   c.ssd_mail<a.ssd_mail
join ves on a.id_ves=ves.id_ves
where c.id_ves is null
and 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
order by a.ssd_data,a.id_ves

Такой запрос, конечно, красивый. Но вот выполняется он в среднем на 2 сек дольше, чем с "and not exists". Мой 5 сек, Ваш - 7 сек. Запускала по очереди порядка 10 раз.
Но в любом случае, когда выполняешь его в ХП, все также медленно выполняется ХП, порядка 5 мин.


 
Desdechado ©   (2007-01-16 15:44) [6]

а зачем нужна процедура из одного запроса?


 
evvcom ©   (2007-01-16 15:50) [7]

> [5] SLP ©   (16.01.07 14:40)
> он в среднем на 2 сек дольше

значит оптимизатор нормально разруливал

> Но в любом случае, когда выполняешь его в ХП, все также
> медленно выполняется ХП, порядка 5 мин

значит план другой. Я с MS мало общался, но помню читал как-то советы по этому поводу. Есть в справке такое:
Creating a stored procedure that specifies the WITH RECOMPILE option in its definition ...
может это и не хороший совет (устранение последствий, а не причины), но тем не менее.

> cast(convert(char(10),a.ssd_mail,102) as datetime))

а это зачем? Если данные по сути дата или число не надо их хранить в строке! Аналогично с параметрами.


 
clickmaker ©   (2007-01-16 15:53) [8]


> [6] Desdechado ©   (16.01.07 15:44)
> а зачем нужна процедура из одного запроса?

а что в этом криминального?


 
Ega23 ©   (2007-01-16 15:54) [9]


> а это зачем? Если данные по сути дата или число не надо
> их хранить в строке! Аналогично с параметрами.


Это так округляется время и берётся предыдущий день.


 
evvcom ©   (2007-01-16 15:58) [10]

> [9] Ega23 ©   (16.01.07 15:54)
> Это так округляется время и берётся предыдущий день

А, ну да... :)))
Только для этого есть спец.функция округления, но ты то знаешь это. Осталось автору это рассказать.


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


> evvcom ©   (16.01.07 15:50) [7]

Почитала книжки по серверу, справку, запускала 2 варианта выполнения процедуры ( с "and not exists" и с left join) :

exec DBO.SSD_DELAYED_period1 "20070101","20070115" with recompile

- результат тот же. от 5 до 8 мин.


> evvcom ©   (16.01.07 15:58) [10]


Расскажите, пожалуйста.


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

> [10] evvcom ©   (16.01.07 15:58)
> Только для этого есть спец.функция округления,

В MSSQL? какая?


 
evvcom ©   (2007-01-16 17:13) [13]

> [12] Павел Калугин ©   (16.01.07 17:05)

Чего, нету что ль? Бардак.
Помнится перед Новым Годом как раз Ega23 в какой-то ветке и говорил об округлениях даты без конвертации к чару. Round дату принимает?


 
Desdechado ©   (2007-01-16 17:23) [14]

clickmaker ©   (16.01.07 15:53) [8]
> а что в этом криминального?
Да ничего, если без фанатизма. Только зачем?


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

А если выполнить в QueryAnalizer что-то в духе
declare
@d_mail datetime,
@d_mail1 datetime

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, start_ssd b  
join ves on b.id_ves=ves.id_ves
where a.ssd_mail>=@d_mail
and a.ssd_mail<=@d_mail2
and a.id_ssd=b.id_ssd
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

exec [ssd_delayed_period]  @d_mail, @d_mail1


и сравнить планы выполнения?
Кстати, лучшие собаководы рекомендуют начинать процедуру с команды SET NOCOUNT ON (но это я так, к слову)


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

@d_mail2 datetime


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


> Bless ©   (16.01.07 17:25) [16]


Спасибо. уже запустила, крутится 5 минуту....
Не знаю как разрулить ситуацию, завтра уже напишу планы выполнения. Нужно идти домой.


 
Bless ©   (2007-01-17 11:59) [18]


> SLP ©   (16.01.07 17:31) [17]
>  крутится 5 минуту....Не знаю как разрулить ситуацию, завтра
> уже напишу планы выполнения. Нужно идти домой.


Ну и как все прошло?


 
SLP ©   (2007-01-17 12:54) [19]


> Bless ©   (17.01.07 11:59) [18]


Отвлеклась на другую работу... А насчет ХП : выполняется около 7 мин, планы запросов select-а и ХП на экране смотрю одновременно, но что с чем и как сравнивать и как их понимать не знаю. На каждом этапе и в первом и во-втором случае указывается % от всего выполнения selеcta ли ХП. А время выполнения этого этапа, например там где 70% не указывается, вернее я не вижу
Индексы в табл меняла, не помогает. Сейчас индексы по ssd_mail, datetime, id_ves. PK по id_ssd.


 
Ega23 ©   (2007-01-17 13:10) [20]


> Помнится перед Новым Годом как раз Ega23 в какой-то ветке
> и говорил об округлениях даты без конвертации к чару. Round
> дату принимает?
>


Я делаю
Declare @dt datetime
Set @dt=getdate()
Select @dt=Cast(Cast(@dt as int) as datetime)


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

> [20] Ega23 ©   (17.01.07 13:10)

а я через строку привык гонять... Через целое быстрее разве?


 
Ega23 ©   (2007-01-17 13:30) [22]


> а я через строку привык гонять... Через целое быстрее разве?
>
>


дык. DateTime ведь число.


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

> [22] Ega23 ©   (17.01.07 13:30)

а конверту не пофиг?


 
Ega23 ©   (2007-01-17 13:36) [24]


> а конверту не пофиг?


Шут его знает. Специально не проверял, но мне кажется, что через int быстрее будет.


 
Ega23 ©   (2007-01-17 13:46) [25]

Шеф так делает
  Set @Date=cast( Floor(cast(@DateTime as numeric(18,12))) as datetime)
Это, ИМХО, как-то мутновато...


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

> [24] Ega23 ©   (17.01.07 13:36)

Олег, через округление числа - грабля...
declare @d datetime
select @d=convert(datetime,"17 Jan 2007 23:59:59:01",13)
select @d
Select Cast(Cast(@d as int) as datetime)
select convert(datetime,convert(varchar,@d,3),3)

и сравни результаты. иногда это ошибка.


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

I>
> SLP ©   (17.01.07 12:54) [19]


А на [19] ничего не напишите?


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

> [25] Ega23 ©   (17.01.07 13:46)

вот через флур - это верно. грабли не будет..


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

> [27] SLP ©   (17.01.07 13:52)

а план запроса посмотреть дашь?


 
Ega23 ©   (2007-01-17 13:58) [30]


> Олег, через округление числа - грабля...


Согласен. Это я не продумал.
Ну тогда [25] - та наверняка


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

> [30] Ega23 ©   (17.01.07 13:58)

а select convert(datetime,convert(varchar,@d,3),3) чем не то?
ну да собстно результат то один и тот же...

> [27] SLP ©   (17.01.07 13:52)

если снять скриншот плана запроса и выложить через какой нибудь файлообменник будет проще.


 
Bless ©   (2007-01-17 14:07) [32]


> SLP ©   (17.01.07 12:54) [19]
>


Я правильно понял, что или ХП или запрос занял 70% от общего времени выполнения?
Если так, то это как-то не согласуется с твоими 5 мин против 2 сек.
Или ты опечаталась и на самом деле 5 мин против 2 мин?
Впрочем, в любом случае неплохо бы глянуть план.
Я правильно понимаю, что ты не знаешь, как его в текстовом виде получить?
Если да, то выполни сначала в Query Analizer-е
set showplan_all on, а потом
еще раз то, что в [15]. Полученные планы выложи здесь.


 
Bless ©   (2007-01-17 14:10) [33]

А на
http://sql.ru/forum/actualforum.aspx
спрашивать не пробовала?
Твой вопрос все же не к программированию баз в делфи, а чисто к MS SQL больше относится. Да и народу там поболе тусуется, шансы получить ответ выше.


 
Ega23 ©   (2007-01-17 14:11) [34]


> а select convert(datetime,convert(varchar,@d,3),3) чем не
> то?


Ты по-аккуратнее с varchar без длины.


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

> [34] Ega23 ©   (17.01.07 14:11)

:) но работает:) хотя если написать
declare @v varchar
set @v=convert(varchar,getdate(),3)

то получим @v="1"
а если просто  
select convert(varchar,getdate(),3)
то получим 17/01/07


 
stone ©   (2007-01-17 14:35) [36]


> то получим @v="1"

по умолчанию при объявлении переменной размер варчар равен мин. кол-ву символов, т.е. 1

> select convert(varchar,getdate(),3)
> то получим 17/01/07

при конвертации размер по умолчанию = макс кол-ву символов конвертируемого типа

2 Ega23 ©   (17.01.07 14:11) [34]
так что тут все нормально :)


 
SLP ©   (2007-01-17 14:43) [37]


> Bless ©   (17.01.07 14:10) [33]


Спасибо. Сделала план запросов через "set showplan_all on", но там черт ногу сломает: 45 записей, куча полей, я все это записала как .csv, потом открыла Excel-ем, во-первых, Вам не послать и не выложить здесь, а во-вторых, даже неудобно, что кто-то будет тратить свое время, чтобы в этом разбираться...  


> Павел Калугин ©   (17.01.07 13:53) [29]
> > [27] SLP ©   (17.01.07 13:52)
>
> а план запроса посмотреть дашь?

Я бы дала посмотреть скриншоты, но выкладывать некуда.


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

> [37] SLP ©   (17.01.07 14:43)

народ, рапида, и так далее..


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

http://slil.ru/


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


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


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



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

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

Наверх





Память: 0.56 MB
Время: 0.105 c
3-1169214222
barakuda
2007-01-19 16:43
2007.04.15
програмная настройка БДЕ


2-1174651901
VVladimir
2007-03-23 15:11
2007.04.15
Сделать "Wizard"


2-1174592426
CatRin
2007-03-22 22:40
2007.04.15
Люди! Срочно! Помогите!


10-1131360404
NORDmen
2005-11-07 13:46
2007.04.15
вызов word из dll


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский