Страница 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 Галактики о них даже не подозревает :grin:

Я бы предложил такой вариант:

Код: Выделить всё

.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 проводки" + номер накладной. Данных с одинаковыми параметрами больше сотни. Подскажите где и что не так?