Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Разница по времени


Автор: Fedorenkoda 20.8.2002, 19:14
Уважаемые знатоки!Помогите, пожалуйста, решить проблему.
Я написал запрос на подсчет суммы в таблице MS SQL 7.
Запрос выбирает данные из таблицы за 1 месяц.Это выглядит так:

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

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

where (period between @data1 and @data2)

Но, что самое удивительное, такой запрос работает почти 1,5 минуты.
Вопрос: В чем дело? Никакого существенного различия между запросами
я не вижу.
Помогите, пожалуйста.

Автор: Vit 20.8.2002, 21:49
У тебя в таблице миллионы записей или допотопный компьютер? Если нет, то похоже проблема в том что поле "period" не проиндексировано. Добавьте индекс по этому полю...

Автор: Fedorenkoda 20.8.2002, 22:29
В моей таблице миллионы записей. Поле не проиндексировано. Но вопрос то в другом, почему такая разница во времени выполнения двух идентичных запросов?

Автор: Fedorenkoda 20.8.2002, 23:12
В запросе участвуют примерно 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

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

Автор: Vit 20.8.2002, 23:22
Не знаю, но введение индекса абсолютно необходимо, так как без индекса вы заставляете сервер прочитывать всю таблицу от начала до конца. Введите индекс и у вас отпадёт эта проблема.


PS. Вообще-то это тема для раздела баз данных. Перенести туда?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)