powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разница по времени выполнения двух идентичных запросов
12 сообщений из 12, страница 1 из 1
Разница по времени выполнения двух идентичных запросов
    #32044634
Fedorenkoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые знатоки!Помогите, пожалуйста, решить проблему.
Я написал запрос на подсчет суммы в таблице MS SQL 7.
Запрос выбирает данные из таблицы за 1 месяц.Это выглядит так:

where (period between '07/01/02' and '08/01/02')

Такой запрос работает примерно 20 секунд. Но т.к. мне нужен
универсальный запрос, то я написал хранимую процедуру, в которую
передаю эти две даты, т.е. запрос уже будет таким:

where (period between @data1 and @data2)

Но, что самое удивительное, такой запрос работает почти 1,5 минуты.
Вопрос: В чем дело? Никакого существенного различия между запросами
я не вижу.
Помогите, пожалуйста.
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044636
Фотография Hermitap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сколько записей в таблице?
что-то 20 секунд многовато чтобы сумму посчитать....

и полные тексты запросов приведи.
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044650
Fedorenkoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В запросе участвуют примерно 100000 записей.

1 вариант(время выполнения 26 секунд):

Select 'ДГТС ','Абонентная плата','КВС',
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where d.Fine>10 and p.Number=d.Number and (c.Branch=1)
and c.Client=p.Client and p.ServiceType=2
and (p.Period between '07/01/02' and '08/01/02')),
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p
where c.Branch=1 and c.Client=p.Client
and p.ServiceType=2
and (p.Period between '07/01/02' and '08/01/02')),0.00


2 вариант(время выполнения 2 минуты 46 секунд):
declare @period1 datetime,@period2 datetime
select @period1='07/01/02'
select @period2=dateadd(month,1,@period1)

Select 'ДГТС ','Абонентная плата','КВС',
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where d.Fine>10 and p.Number=d.Number and (c.Branch=1)
and c.Client=p.Client and p.ServiceType=2
and (p.Period between @period1 and @period2)),
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p
where c.Branch=1 and c.Client=p.Client
and p.ServiceType=2
and (p.Period between @period1 and @period2)),0.00

В чем же разница между запросами?
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044693
Фотография Сергей Тихонов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй BETWEEN заменить на вот это:

and (p.Period >= @period1 and p.Period <= @period2)
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044759
Fedorenkoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже пробовал заменить between на конструкцию >= ...<=
Не помогло.

Знатоки! Не ужели вы не сталкивались с таким феноменом?
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044806
Фотография Hermitap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя какой-то хитро сложный запрос.

20 секунд это очень много для суммы.
попробуй упростить запрос.
Добейся выполнения запроса за секунду.

для 100 000 это можно сделать.

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

Дело в том что план выполнения на запрос и на сохраненку строится по разному немногу.. поэтому могут быть проблеммы.
Но в любом случае правь запрос.
Лично мое мнение, мне кажется запрос у тебя неправильно составлен. вот и логика сервера "ошибается"
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044811
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO
просто при построении плана выполнения т.к. для первого запроса диапазон дат известен планировщику, то он скорее всего использует какой-либо индекс, включающий себя поле p.Period

Для второго же запроса, где используются переменные, планировщик не может определить заранее, что нужно использовать это индекс. Ведь переменная приобредет значение только при выполнении пакета.

Проанализируйте планы выполнения обеих запросов.
Если действительно в первом запросе используется Index Seek/Scan, а во втором - Table Scan, то можно принудить оптимизатор к использованию индекса с помощью
WITH (INDEX(...))
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044822
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё проверь, какой тип у поля p.Period, сдаётся мне, что он не datetime.

А что будет, если по человечески написать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare @period1 datetime,@period2 datetime 
select @period1='07/01/02' 
select @period2=dateadd(month, 1 ,@period1) 

Select 'ДГТС ','Абонентная плата','КВС', 
(select sum(isnull(p.Summa, 0 . 00 ))
from Pers_Account p 
	INNER JOIN Client c ON c.Client=p.Client and c.Branch= 1 
	INNER JOIN DEVICENUMBER d ON d.Fine> 10  and p.Number=d.Number
where p.ServiceType= 2  
and (p.Period between @period1 and @period2)),
(select sum(isnull(p.Summa, 0 . 00 ))
from Pers_Account p 
	INNER JOIN Client c ON c.Branch= 1  and c.Client=p.Client
where p.ServiceType= 2  
and (p.Period between @period1 and @period2)), 0 . 00 
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044895
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)) Забавно, но пока никто (кроме Glory) ничего по существу не ответил. Запросы, конечно, ужасные, но вопрос-то не про это. То есть вопрос звучит не "Почему так долго?", а "Почему в 4 с лишним раза дольше?".
Прикол в том, что у нас в аналогичной ситуации результаты были ровно обратные (то есть при использовании констант время выполнения запроса было существенно больше, чем при использовании переменных). В общем "темна вода во облацех"...
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044899
Fedorenkoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые знатоки! Может я неправильно сформировал запрос. Но тогда другой вопрос:

1 запрос
Select 'ДГТС ','Абонентная плата','КВС',
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where d.Fine>10 and p.Number=d.Number and (c.Branch=1)
and c.Client=p.Client and p.ServiceType=2
and (p.Period between '07/01/02' and '08/01/02'))

2 запрос
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where d.Fine>10 and p.Number=d.Number and (c.Branch=1)
and c.Client=p.Client and p.ServiceType=2
and (p.Period between '07/01/02' and '08/01/02'))

Давайте абстрагируемся от индексов и всего прочего.
Почему первый запрос работает 5 секунд, а второй 7 секунд.
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32044919
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А бог его знает.
Так оптимизатор соптимизировал.
Я в таких случаях сначала делаю sp_updateststs, просто так на всякий случай, а уж потом разбираюсь.
Надо смотреть екзекушин план, так не понять.
Можно попробовать всякие хинты к селекту использовать.
Но смысл примерно такой - туповат оптимизатор.
Правда, ещё существует вероятность, что вы, мягко говоря, не всю правду говорите. Ведь время выполнения запроса - величина непостоянная.
Ну например, во время выполнения второго запроса был скачёк нагрузки на сервере.
...
Рейтинг: 0 / 0
Разница по времени выполнения двух идентичных запросов
    #32046370
antal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К знатокам себя не отношу и не буду рассуждать на тему возможных причин данного явления, однако сталкивался с подобной ситуацией - без хранимой процедуры работает намного (обычно в разы) быстрее, чем в оной. Проявлялось именно на типе datetime. Единственный вариант, который сработал, это замена переменных-параметров в запросе на локальные переменные, объявленные в теле процедуры.
Например:
create procedure abc
@num int,
@period1 datetime,
@period2 datetime
as
declare @p1 datetime set @p1 = @period1
declare @p2 datetime set @p2 = @period2
/*далее остальной текст процедуры*/
--...where (period between @p1 and @p2)
Буду рад, если поможет.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разница по времени выполнения двух идентичных запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]