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

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

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

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

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

Сообщение 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)))));
но выборка из нее происходит слишком долго.
Помогите оптимизировать.
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

а не нужно юзать такую уйму фильтров. юзай индексы
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

ну вот это
SchFact.nRec == BookPrZk.cSchFact
можно однозначно перенести из фильтра, по поводу поля tipuser, тут уже ни как, либо вообще отказаться от него
но думаю такая подцепка SchFact.nRec == BookPrZk.cSchFact даст немного прироста времени :lol:
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

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

.Create view vBook as select bookprzk.*, schfact.nrec 
where 
        ((
          nSchFact == SchFact.nRec and                     // 1
          SchFact.nRec == BookPrZk.cSchFact                // 2
        ))
;
Может я что-то не допонял... Зачем tipuser проверять? По переменной подвязывается нужная счёт фактура. Если бы // 1 не было тогда понятно, а так как запись уже определена, получается совсем непонятно использование фильтров...
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

я как понял логическая таблица создана для формы, сразу что-то не обратил внимание, но тогда точно никаких фильтров, просто форме должно быть

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

.{?internal;((schfact.tipuser = 7200) or (schfact.tipuser = 7300) or 
                 (schfact.tipuser = 7217) or (schfact.tipuser = 7317))
.@@@@@@@@ .@@@@@@@@@@@@
.}
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

Дело в том, что такая сложная таблица создана из-за того, что при

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

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

а как это все дело оптимизировать, чтобы выборка быстрее шла?
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

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

Сообщение scanner »

Max_Fin может я чего не понял, а может не так объяснил.

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

Выбираются все платежи из книги покупок или продаж соответствующие определенной СФ, по которой формируется отчет. Так вот все бы ничего, но если это "СФ отгрузка", то для ссылки на СФ используется поле bookprzk.cschfact. А если это "платеж по СФ", то используется поле bookprzk.cschfacts. Разница в один символ.
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

Ну дык, для этого и используются две таблицы
BookPrZk.POLE
BookPrZkSyn.POLE
ссылки на них глянь
тока поправь подцепки на двойные "==", малость недописал :oops:
scanner
Постоянный обитатель
Сообщения: 192
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Кемерово, ОАО "Мелькорм"
Контактная информация:

Сообщение scanner »

Все нормально работает, только логику

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

where 
((nSchFact == SchFact.nRec and 
  SchFact.nRec = BookPrZk.cSchFact and 
  SchFact.nRec = BookPrZkSyn.cSchFacts 
));
не совсем понял, поясните если сможете на пальцах. А так огромное спасибо.
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

А чего непонятного?
параллельная подцепка двух таблиц.
Одна корневая - две подчиненных одного уровня.

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

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

((
...
spsopr.cmcusl==katmc.nrec and
spsopr.cmcusl==katusl.nrec
...
));
...
.fields
...
 if(spsopr.prmc=1,katmc.name,katusl.name)
...
.endfields
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

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

Сообщение scanner »

Спасибо! С трудом, но дошло. :D
Ответить