Страница 1 из 2
					
				Помогите оптимизировать лог. таблицу
				Добавлено: 08 дек 2005, 11:21
				 scanner
				Создание данной таблицы происходит довольно долго, подскажите как исправить:
Код: Выделить всё
.Create     view provod as select * from KATSOPR, OBOROT where
((OBOROT.CSOPRDOC == KATSOPR.NREC)) and       //Связь таблиц
((KATSOPR.VIDSOPR = 211) or                //Акт на оказание услуги  (сбыт)
(KATSOPR.VIDSOPR = 201) or                 //Накладная на отпуск МЦ  (сбыт)
(KATSOPR.VIDSOPR = 106)) and               //Рекламационная накладная от покупателя на возврат МЦ  (сбыт)
(KATSOPR.DSOPR <= d2) and (KATSOPR.DSOPR >= d1) and
(OBOROT.DBSCHETO = 62);
 
			 
			
					
				
				Добавлено: 08 дек 2005, 11:34
				 Johny
				попробуй прописать вместо * реально нужные поля
			 
			
					
				
				Добавлено: 08 дек 2005, 11:36
				 scanner
				не помогает
			 
			
					
				
				Добавлено: 08 дек 2005, 11:37
				 Алексей
				1. ну " as select * " эту часть вообще убери из запроса, тогда она будет вытаскивать только те поля, к которым есть обращение далее, а не все поля из всех таблиц.
2.  where((
       cPlan                  == oborot.cplanssch
and  oborot.csoprdod  == katsopr.nrec
and  '62'                     == oborot.dbscheto (noindex)  // не помню точный индекс
)) and (oborot.tidk=122 OR oborot.tidk=201 OR oborot.tidk=106)
    and (katsopr.dsopr <=d2 and katsopr.dsopr>=d1);
cPlan = ссылка на план счетов (можно взять в настройке)
ну и индекс посмотри по обороту, можте подберёшь что нибудь ещё.
			 
			
					
				
				Добавлено: 08 дек 2005, 11:38
				 Алексей
				Блин, 
.Create  view provod from OBOROT where
Выборка то по проводкам, зачем написал from katsopr ? понятно дело у тебя там хренова туча записей вываливается.
			 
			
					
				
				Добавлено: 08 дек 2005, 11:43
				 scanner
				Алексей
потом береться ссылка на СФ и в ней заполняется внешний атрибут в соответствие с проводками к накладной.
			 
			
					
				
				Добавлено: 08 дек 2005, 11:45
				 Алексей
				scanner
Да пожалуйста.
Подвязывайте С/Ф и делайте с ней что хотите.
вроде бы делается так
katsopr.cschfact == schfact.nrec
Выборка то быстрее стала работать или нет?
			 
			
					
				
				Добавлено: 08 дек 2005, 11:47
				 scanner
				не особо это все помогло
			 
			
					
				
				Добавлено: 08 дек 2005, 11:49
				 Алексей
				Начинайте тогда с малого. Сначала выберите нужные проводки, потом подключайте по немного остальные части запроса. 
(тестировать можно в саппорте SQL)
			 
			
					
				
				Добавлено: 08 дек 2005, 11:53
				 scanner
				Вообще изначально ставился фильтр по датам по которым еще нет накладных, суппорт думал минут 5.
			 
			
					
				
				Добавлено: 08 дек 2005, 12:16
				 Johny
				Вопрос. А глюк точно в запросе?
Только что скопировал и запустил в суппорт sql
select * from KATSOPR, OBOROT where
((OBOROT.CSOPRDOC == KATSOPR.NREC)) and       //Связь таблиц 
((KATSOPR.VIDSOPR = 211) or                //Акт на оказание услуги  (сбыт) 
(KATSOPR.VIDSOPR = 201) or                 //Накладная на отпуск МЦ  (сбыт) 
(KATSOPR.VIDSOPR = 106)) and               //Рекламационная накладная от покупателя на возврат МЦ  (сбыт) 
(KATSOPR.DSOPR <= date(30,09,2005)) and (KATSOPR.DSOPR >= date(01,01,2005)) and
(OBOROT.DBSCHETO = 62); 
То есть ничего не менял. Только разве что период выставил ручками
Секунд 10 думал и выкинул все как надо
 
			 
			
					
				
				Добавлено: 08 дек 2005, 12:20
				 Алексей
				select oborot.sumob from oborot where ((
cPlan == oborot.cplanssch 
211   ==  oborot.tidk
and '62' == oborot.dbscheto (noindex) 
and oborot.csoprdod /== katsopr.nrec 
));
Это выберет проводки, по типу 211 которые привязаны к накладным.
Попробуйте сначала так.
Если всё Ок, поставите потом ограничение на katsopr по датам. Вобще лушче бы по датам сами проводки проверять, индекс есть.
			 
			
					
				
				Добавлено: 08 дек 2005, 14:01
				 scanner
				каким образом при использовании индексов наряду с использованием AND вставить и условие OR?
т.е. например 
((cPlan == oborot.cplanssch and
(211 == oborot.tidk or 201 == oborot.tidk)))
			 
			
					
				
				Добавлено: 08 дек 2005, 17:48
				 WiRuc
				scanner писал(а):каким образом при использовании индексов наряду с использованием AND вставить и условие OR?
т.е. например 
((cPlan == oborot.cplanssch and
(211 == oborot.tidk or 201 == oborot.tidk)))
При OR нельзя задействовать индексы. Есть специальные технологии типа ORing, но недо-SQL Галактики о них даже не подозревает 
 
Я бы предложил такой вариант:
Код: Выделить всё
.Create view provod 
from OBOROT, KATSOPR
where 
((
  '562' == OBOROT.SCHETO  AND // 562 - это номер плана счетов + '62' 
  d1 <<= OBOROT.DATOB AND
  d2 >>= OBOROT.DATOB AND
  OBOROT.CSOPRDOC == KATSOPR.NREC
)) and (OBOROT.TIDK = 201 OR OBOROT.TIDK = 211 OR OBOROT.TIDK = 106);
или 
Код: Выделить всё
.Create view provod 
from OBOROT, KATSOPR
where 
((
  '562' == OBOROT.SCHETO  AND // 562 - это номер плана счетов + '62' 
  d1 <<= OBOROT.DATOB AND
  d2 >>= OBOROT.DATOB AND 
  (OBOROT.TIDK = 201 OR OBOROT.TIDK = 211 OR OBOROT.TIDK = 106) AND
  OBOROT.CSOPRDOC == KATSOPR.NREC
));
 
			 
			
					
				
				Добавлено: 09 дек 2005, 07:59
				 scanner
				Написал следующим образом
Код: Выделить всё
.Create                             view provod as select * from KATSOPR, OBOROT where
(('362' == OBOROT.ScHETO and OBOROT.CSOPRDOC == KATSOPR.NREC and
d1 <<= OBOROT.DATOB and d2 >>= OBOROT.DATOB)) and       //Связь таблиц
((KATSOPR.VIDSOPR = 211) or                //Акт на оказание услуги  (сбыт)
(KATSOPR.VIDSOPR = 201) or                 //Накладная на отпуск МЦ  (сбыт)
(KATSOPR.VIDSOPR = 106));
Но! Данная таблица строилась для того, чтобы получит проводку со счетом "362" соответственно накладной. Проверял данная проводка одна, накладная тоже одна.
А теперь про НО! Пытаюсь вывести "субсчет проводки" + "NREC проводки" + номер накладной. Данных с одинаковыми параметрами больше сотни. Подскажите где и что не так?