| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Вообще-то это тема для раздела баз данных. Перенести туда? |