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