Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Очень большой запрос в MS SQL 7.0


Автор: Fedorenkoda 16.8.2002, 21:39
Уважаемые мастера! Мне необходимо получить итоговый отчет деятельности фирмы, но у меня возникла следующая ситуация.Мой запрос состоит из 2033 строк. И при его выполнении возникает такая ошибка:
Changed language setting to us_english.
ODBC: Msg 0, Level 19, State 1
SqlDumpExceptionHandler: Process 12 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process.

Connection Broken

Я не могу понять, что это за ошибка.
И если можно помогите пожалуйста оптимизировать запрос,т.к. он содержит много повторяющихся элементов. Вот его кусок:
Select 'Абонентная плата','КВС',
((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.2002' and '08.01.2002'))-
(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.2002' and '08.01.2002'))),
(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.2002' and '08.01.2002')),0.00
union all
Select 'Абонентная плата','НХС с ндс',
((select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p
where c.Client=p.Client
     and (c.Branch<>1 and c.Branch<>30)
     and p.ServiceType=2
     and (p.Period between '07.01.2002' and '08.01.2002'))-
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where c.Client=p.Client and p.Number=d.Number  
     and (c.Branch<>1 and c.Branch<>30)
     and p.ServiceType=2 and d.Fine>10
     and (p.Period between '07.01.2002' and '08.01.2002'))),
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where c.Client=p.Client and p.Number=d.Number  
     and (c.Branch<>1 and c.Branch<>30)
     and p.ServiceType=2 and d.Fine>10
     and (p.Period between '07.01.2002' and '08.01.2002')),
((select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p
where c.Client=p.Client
     and (c.Branch<>1 and c.Branch<>30)
     and p.ServiceType=2
     and (p.Period between '07.01.2002' and '08.01.2002'))-
(select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p , DEVICENUMBER d
where c.Client=p.Client and p.Number=d.Number  
     and (c.Branch<>1 and c.Branch<>30)
     and p.ServiceType=2 and d.Fine>10
     and (p.Period between '07.01.2002' and '08.01.2002'))+
(select  isnull(sum(r.Summa),0.00)
from  Pers_Account p ,Recalc r,Client c
where r.Pers_Account=p.Pers_Account and c.Client=p.Client
     and p.ServiceType=2        
      and OperationType in (1,3,5)
     and (c.Branch<>1 and c.Branch<>30)
     and (r.RDate between '07.02.2002' and '08.01.2002')))/5
union all
Select 'Абонентная плата','НХС без ндс',
((select isnull(sum(p.Summa),0.00)
from Client c , Pers_Account p
where c.Branch=30
     and c.Client=p.Client and p.ServiceType=2
     and (p.Period between '07.01.2002' and '08.01.2002'))-
(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=30)
     and c.Client=p.Client and p.ServiceType=2
     and (p.Period between '07.01.2002' and '08.01.2002'))),
(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=30)
     and c.Client=p.Client and p.ServiceType=2
     and (p.Period between '07.01.2002' and '08.01.2002')),0.00
union all
...

Помогите пожалуйста

Автор: Vit 16.8.2002, 21:56
1) Повторяющиеся константы определи 1 раз, как переменные, а затем их используй
2) Проследи чтобы были индексы по всем полям, упомянутым в "Where" секции
3) Попробуй упростить кверю (например разбить её по местам где у тебя union на несколько), посмотри проходит ли она в упрощённом виде, затем постепенно усложняй
4) Проверь языковые установки, почему-то ошибка вываливается о языке...

Автор: Keks 23.9.2002, 05:19
Такое же сообщение вываливается у меня при выполнении запроса с full join трех таблиц если в них много строк. При малом числе строк все нормально! Я считаю это просто позорным багом.

Автор: Vit 23.9.2002, 08:05
Цитата(Keks @ 22.9.2002, 13:19)
Такое же сообщение вываливается у меня при выполнении запроса с full join трех таблиц если в них много строк. При малом числе строк все нормально! Я считаю это просто позорным багом.

Я делал Full Join на десяток таблиц с довольно большим количеством строк. Проверь свободное место на диске и установлены ли последние SP для сервера.

Автор: AntonSaburov 16.10.2002, 23:31
Кроме советов выше - у меня есть опыт, что делать все единым запросом не всегда быстро. Бывает удобно использовать временные таблицы.

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