[ОТВЕТИТЬ]
Опции темы
27.06.2008 16:59
 
Например, как предложил Андрей. Судя по плану запроса, выложенному мной, там всё стало намного лучше...
27.06.2008 17:07
 
Ок, спасибо, попробую.

эээээ
Код:
(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
 
Нет. Не прокатит:
Цитата:
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
27.06.2008 17:32
 
Ссылка по теме:
28.06.2008 06:46
 
Вот только у моего варианта смысл немного другой.
У тебя было: продажи после переоценки в тот же день.
У меня: продажи после переоценки в течение суток.

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

можно еще этот кусок попробовать переделать
Код:
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
 
Сделал так, как посоветовали. Мой запрос выполняется порядка пяти минут на небольшой базе за месяц. Переделанный запрос - висел минут 30 и вывалился с ошибкой РБС. Так и должно быть?
30.06.2008 10:55
 
вот текст измененного запроса. так должно быть?
Код:
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
 
Вот это убери
Код:
 to_char(cc.printtime,'DD.MM.YYYY') =to_char(log.eventtime,'DD.MM.YYYY') and
30.06.2008 10:59
 
Кстати, в принципе можно вообще оставить только:
Код:
(cc.printtime - log.eventtime) > 0
30.06.2008 15:13
 
Цитата:
Mtirt Кстати, в принципе можно вообще оставить только:
Код:
(cc.printtime - log.eventtime) > 0
Это, наверное, нехорошо будет. полезут же все чеки, более поздние, чем переоценка.
если переоценка была год назад - совсем беда.
надо тогда еще максимальный cc.printtime задавать и минимальный log.eventtime (его, кстати, надо в любом случае. ну кому нафиг нужны эти задержки прохода цены на кассу годичной давности?)


Опции темы



Часовой пояс GMT +3, время: 16:48.

Все в прочитанное - Донат - RSS - - Карта - Вверх

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