Страница 1 из 1

Оптимизировать создание лог. табл.

Добавлено: 26 май 2005, 08:52
scanner
Создаю лог. таблицу

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

.Create view vBook as select bookprzk.*, schfact.nrec, schfact.tipuser
where ((nSchFact == SchFact.nRec)) and
((((SchFact.nRec = BookPrZk.cSchFact) and
((schfact.tipuser = 7200) or (schfact.tipuser = 7300))) or
((SchFact.nRec = BookPrZk.cSchFacts) and
((schfact.tipuser) = 7217 or (schfact.tipuser = 7317)))));
но выборка из нее происходит слишком долго.
Помогите оптимизировать.

Добавлено: 26 май 2005, 17:02
Maverick
а не нужно юзать такую уйму фильтров. юзай индексы

Добавлено: 26 май 2005, 17:13
Max_Fin
ну вот это
SchFact.nRec == BookPrZk.cSchFact
можно однозначно перенести из фильтра, по поводу поля tipuser, тут уже ни как, либо вообще отказаться от него
но думаю такая подцепка SchFact.nRec == BookPrZk.cSchFact даст немного прироста времени :lol:

Добавлено: 27 май 2005, 13:34
DarkAngel27

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

.Create view vBook as select bookprzk.*, schfact.nrec 
where 
        ((
          nSchFact == SchFact.nRec and                     // 1
          SchFact.nRec == BookPrZk.cSchFact                // 2
        ))
;
Может я что-то не допонял... Зачем tipuser проверять? По переменной подвязывается нужная счёт фактура. Если бы // 1 не было тогда понятно, а так как запись уже определена, получается совсем непонятно использование фильтров...

Добавлено: 27 май 2005, 13:48
Max_Fin
я как понял логическая таблица создана для формы, сразу что-то не обратил внимание, но тогда точно никаких фильтров, просто форме должно быть

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

.{?internal;((schfact.tipuser = 7200) or (schfact.tipuser = 7300) or 
                 (schfact.tipuser = 7217) or (schfact.tipuser = 7317))
.@@@@@@@@ .@@@@@@@@@@@@
.}

Добавлено: 30 май 2005, 06:19
scanner
Дело в том, что такая сложная таблица создана из-за того, что при

(schfact.tipuser = 7200) or (schfact.tipuser = 7300), должно браться поле bookprzk.cschfact

а при (schfact.tipuser = 7217) or (schfact.tipuser = 7317), должно браться поле bookprzk.cschfacts

а как это все дело оптимизировать, чтобы выборка быстрее шла?

Добавлено: 30 май 2005, 11:14
Max_Fin
а в чем проблема написать, например, так

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

.Create view vBook as select 
bookprzk.*, bookprzksyn.*, schfact.nrec, schfact.tipuser 
from 
  bookprzk, 
  Synonym bookprzk bookprzksyn, 
  schfact
where 
((nSchFact == SchFact.nRec and 
  SchFact.nRec = BookPrZk.cSchFact and
  SchFact.nRec = BookPrZkSyn.cSchFacts
));

.fields
...
  if ((schfact.tipuser = 7200) or (schfact.tipuser = 7300),  BookPrZk.POLE,
     if ((schfact.tipuser = 7217) or (schfact.tipuser = 7317), BookPrZkSyn.POLE, '')
...
.endfields

Добавлено: 30 май 2005, 13:46
scanner
Max_Fin может я чего не понял, а может не так объяснил.

Дело в том что создается таблица, для выбора из нее других данных, например bookprzk.sum.

Выбираются все платежи из книги покупок или продаж соответствующие определенной СФ, по которой формируется отчет. Так вот все бы ничего, но если это "СФ отгрузка", то для ссылки на СФ используется поле bookprzk.cschfact. А если это "платеж по СФ", то используется поле bookprzk.cschfacts. Разница в один символ.

Добавлено: 30 май 2005, 14:20
Max_Fin
Ну дык, для этого и используются две таблицы
BookPrZk.POLE
BookPrZkSyn.POLE
ссылки на них глянь
тока поправь подцепки на двойные "==", малость недописал :oops:

Добавлено: 30 май 2005, 15:24
scanner
Все нормально работает, только логику

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

where 
((nSchFact == SchFact.nRec and 
  SchFact.nRec = BookPrZk.cSchFact and 
  SchFact.nRec = BookPrZkSyn.cSchFacts 
));
не совсем понял, поясните если сможете на пальцах. А так огромное спасибо.

Добавлено: 30 май 2005, 15:38
Maverick
А чего непонятного?
параллельная подцепка двух таблиц.
Одна корневая - две подчиненных одного уровня.

Аналогом может быть связка из оперативного контура когда ищем МЦ или услугу:

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

((
...
spsopr.cmcusl==katmc.nrec and
spsopr.cmcusl==katusl.nrec
...
));
...
.fields
...
 if(spsopr.prmc=1,katmc.name,katusl.name)
...
.endfields

Добавлено: 30 май 2005, 15:50
Max_Fin
ну вот, весь секрет рассказал :roll:
:lol:

Добавлено: 31 май 2005, 06:07
scanner
Спасибо! С трудом, но дошло. :D