[ТЕМА ЗАКРЫТА]
Опции темы
31.10.2007 11:31  
Pyatak
Цитата:
Сообщение от OlegON
Думаю правильнее будет завести в оракловом разделе тему с указанием запроса. Ругается Оракл, а не оптимайзер. Что-то с литералами напутал.
Собственно, вот, отдельная тема.

Итак, имеем простой запрос:
Код:
SELECT dc.article as "Артикул",
       c.name as "Наименование"
  FROM supermag.smdocuments d,
       supermag.smspec dc,
       supermag.smcard c
 WHERE d.doctype=dc.doctype
   AND d.id=dc.docid
   AND c.article=dc.article
   AND c.accepted = 1
   AND d.doctype='WI'
   AND d.docstate>1
   AND TO_DATE(d.createdat) BETWEEN ('%DATE1%') AND ('%DATE2%')
   AND d.clientindex = (%VEN%)
GROUP BY dc.article, c.name
ORDER BY c.name
при cursor_sharing=exac, всё ОК!

при cursor_sharing=similar, как рекомендует оптимайзер, выдается ошибка ORA-00979: выражение не является выражением GROUP BY

???

на что этот параметр влияет и почему такой эффект?
 
31.10.2007 11:59  
reddevil
select * from v$version;

Чего говорит?
 
31.10.2007 12:25  
Pyatak
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
PL/SQL Release 9.2.0.7.0 - Production
CORE 9.2.0.7.0 Production
TNS for 32-bit Windows: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production
 
31.10.2007 13:03  
reddevil
не обратил внимание сразу - '%DATE1% Что это за среда такая у которой так переменные оформляются?
 
31.10.2007 16:53  
Pyatak
Репортер собственного производства
 
01.11.2007 06:44  
reddevil
Цитата:
Сообщение от Pyatak
Репортер собственного производства
Ну тогда отладчик в руки и вперед, ибо:

Код:
Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0 
Connected as supermag

SQL> 
SQL> define date1='10.10.2007'
SQL> define date2='10.10.2007'
SQL> define ven=181
SQL> alter session set cursor_sharing=EXACT;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------
                                      


32 rows selected

SQL> alter session set cursor_sharing=SIMILAR;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------

32 rows selected

SQL> alter session set cursor_sharing=FORCE;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------


32 rows selected

SQL>
И оффтоп но:
1. AND TO_DATE(d.createdat) BETWEEN ('%DATE1%') AND ('%DATE2%')
я бы подумал над этой строчкой !
2. Зачем group by, distinct был бы если бы возможно быстрей, но даже если и нет то хотя бы логика не страдала.
 
 
Опции темы



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

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