27.06.2008 16:59
Mtirt
 
Например, как предложил Андрей. Судя по плану запроса, выложенному мной, там всё стало намного лучше...
27.06.2008 17:07
Mihon
 
Ок, спасибо, попробую.

эээээ
Код:
(to_number(to_char(cc.printtime,'hh24'))*60 +
 to_number(to_char(cc.printtime,'mi'))) -
(to_number(to_char(log.eventtime,'hh24'))*60 +
 to_number(to_char(log.eventtime,'mi'))) >0
а так не прокатит?
27.06.2008 17:12
Mtirt
 
Нет. Не прокатит:
Цитата:
SELECT STATEMENT, GOAL = CHOOSE 297627 10929 907107
SORT GROUP BY 297627 10929 907107
HASH JOIN 297443 10929 907107
TABLE ACCESS FULL SUPERMAG SMCASHCHECKS 36 32645 489675
HASH JOIN 297397 218582 14863576
TABLE ACCESS FULL SUPERMAG SMCASHCHECKITEMS 41 32645 587610
HASH JOIN 297321 884376 44218800
TABLE ACCESS FULL SUPERMAG SMDOCLOG 27824 20131 523406
TABLE ACCESS FULL SUPERMAG SMSPEC 262797 178869173 4292860152
28.06.2008 06:46
akonev
 
Вот только у моего варианта смысл немного другой.
У тебя было: продажи после переоценки в тот же день.
У меня: продажи после переоценки в течение суток.

Но зато убираются лишние преобразования типов над каждой записью по полям, участвующим в условиях.

можно еще этот кусок попробовать переделать
Код:
max(
(to_number(to_char(cc.printtime,'hh24')) * 60 +
 to_number(to_char(cc.printtime,'mi'))) -
(to_number(to_char(log.eventtime,'hh24')) * 60 +
 to_number(to_char(log.eventtime,'mi')))
) "minutes"
примерно так
Код:
((max(cc.printtime - log.eventtime)) * 1440) "minutes"
только результат округлить еще надо для читабельности.
30.06.2008 10:54
Mihon
 
Сделал так, как посоветовали. Мой запрос выполняется порядка пяти минут на небольшой базе за месяц. Переделанный запрос - висел минут 30 и вывалился с ошибкой РБС. Так и должно быть?
30.06.2008 10:55
Mihon
 
вот текст измененного запроса. так должно быть?
Код:
SELECT 
  to_char(cc.printtime,'DD.MM.YYYY') "date", sp.article, sp.docid, 
((max(cc.printtime - log.eventtime)) * 1440) "minutes", 
to_char(log.eventtime,'hh24:mi:ss') "change_price_time", to_char(cc.printtime,'hh24:mi:ss') "check_time", sp.itemprice "Price", cci.itemprice "check_price"

FROM 
  SUPERMAG.Smspec sp,
  SUPERMAG.Smdoclog log,
  SUPERMAG.Smcashchecks cc,
  SUPERMAG.Smcashcheckitems cci
where 
  log.doctype='AC' and
  log.oldstate=2 and
  log.newstate=3 and
  log.id=sp.docid and
  sp.article=cci.article and
  cc.desknum=cci.desknum and
  cc.znum=cci.znum and
  cc.checknum=cci.checknum and
  to_char(cc.printtime,'DD.MM.YYYY') =to_char(log.eventtime,'DD.MM.YYYY') and
  cci.itemprice<>sp.itemprice and
  (cc.printtime - log.eventtime) < 1 and
  cc.printtime>log.eventtime

group by 
sp.article, sp.docid, log.eventtime, cc.printtime, cci.itemprice, sp.itemprice
30.06.2008 10:57
Mtirt
 
Вот это убери
Код:
 to_char(cc.printtime,'DD.MM.YYYY') =to_char(log.eventtime,'DD.MM.YYYY') and
30.06.2008 10:59
Mtirt
 
Кстати, в принципе можно вообще оставить только:
Код:
(cc.printtime - log.eventtime) > 0
30.06.2008 15:13
akonev
 
Цитата:
Mtirt Кстати, в принципе можно вообще оставить только:
Код:
(cc.printtime - log.eventtime) > 0
Это, наверное, нехорошо будет. полезут же все чеки, более поздние, чем переоценка.
если переоценка была год назад - совсем беда.
надо тогда еще максимальный cc.printtime задавать и минимальный log.eventtime (его, кстати, надо в любом случае. ну кому нафиг нужны эти задержки прохода цены на кассу годичной давности?)
Часовой пояс GMT +3, время: 03:11.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.