Помогите оптимизировать лог. таблицу

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Помогите оптимизировать лог. таблицу

Сообщение 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);
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

попробуй прописать вместо * реально нужные поля
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

не помогает
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

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 = ссылка на план счетов (можно взять в настройке)
ну и индекс посмотри по обороту, можте подберёшь что нибудь ещё.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Блин,
.Create view provod from OBOROT where

Выборка то по проводкам, зачем написал from katsopr ? понятно дело у тебя там хренова туча записей вываливается.
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

Алексей
потом береться ссылка на СФ и в ней заполняется внешний атрибут в соответствие с проводками к накладной.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

scanner
Да пожалуйста.
Подвязывайте С/Ф и делайте с ней что хотите.
вроде бы делается так
katsopr.cschfact == schfact.nrec

Выборка то быстрее стала работать или нет?
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

не особо это все помогло
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Начинайте тогда с малого. Сначала выберите нужные проводки, потом подключайте по немного остальные части запроса.
(тестировать можно в саппорте SQL)
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

Вообще изначально ставился фильтр по датам по которым еще нет накладных, суппорт думал минут 5.
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение 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 думал и выкинул все как надо
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

select oborot.sumob from oborot where ((
cPlan == oborot.cplanssch
211 == oborot.tidk
and '62' == oborot.dbscheto (noindex)
and oborot.csoprdod /== katsopr.nrec
));
Это выберет проводки, по типу 211 которые привязаны к накладным.
Попробуйте сначала так.
Если всё Ок, поставите потом ограничение на katsopr по датам. Вобще лушче бы по датам сами проводки проверять, индекс есть.
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

каким образом при использовании индексов наряду с использованием AND вставить и условие OR?

т.е. например

((cPlan == oborot.cplanssch and
(211 == oborot.tidk or 201 == oborot.tidk)))
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение 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
));
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

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