Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
Добрый день.
Хотелось бы окончательно разобраться в необходимости ставить пробел в хинтах после /*+
В mos(Doc ID 29236.1) черным по белому пишут

Syntax: /*+ HINT HINT ... */

Note: (In PLSQL the space between the '+' and the first letter of the hint is vital as otherwise the hint may be ignored.
So /*+ ALL_ROWS */ is fine but /*+ALL_ROWS */ will cause problems. See Bug:697121


Ссылаясь на баг 8 версии, который судя по описанию бага починили в 9 версии.
Собственно вопрос, для более актуальных версий 11,12,18,19 кто встречал проблемы с работой хинтов из за отсутствия пробела, типа /*+push_pred*/ вместо /+ push_pred*/ и насколько равноправно написание хинтов без пробелов и с ними в текущих реалиях?
В своём опыте всё время писал хинты без пробела и никогда не замечал проблем из за этого

Сообщение было отредактировано: 18 мар 20, 12:49
18 мар 20, 12:47    [22101296]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
-2-
Member

Откуда:
Сообщений: 15279
feagor,

Если сломался пробел, можно вводить кодом Alt+32 на дополнительной цифровой клавиатуре.
18 мар 20, 12:52    [22101302]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
-2-,

спасибо, ценный опыт
18 мар 20, 12:53    [22101304]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
feagor
В своём опыте всё время писал хинты без пробела и никогда не замечал проблем из за этого
Это не означает, что проблем не было...

Пишите пробел в хинтах после "+" и не думайте о возможных проблемах из-за отсутствия этого пробела.
18 мар 20, 13:12    [22101340]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
SQL*Plus,

Хотелось бы всё же найти пример, на котором хинт без пробела реально ломается
18 мар 20, 14:33    [22101450]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
-2-
Member

Откуда:
Сообщений: 15279
feagor
Хотелось бы всё же найти пример, на котором хинт без пробела реально ломается
Ставишь 8.0, пишешь в plsql запрос с хинтом, выполняешь, смотришь в v$sql, что из запроса сделал plsql-компилятор.
18 мар 20, 14:39    [22101464]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2260
feagor,

насколько помню проблема была в строчном --+

.....
stax
18 мар 20, 14:40    [22101465]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29738
+
SQL> var c refcursor
SQL> exec open :c for select /* + first_rows */ * from dual feagor1;

PL/SQL procedure successfully completed.

SQL> exec open :c for select /*+ first_rows */ * from dual feagor2;

PL/SQL procedure successfully completed.

SQL> select sql_text from v$sql where sql_text like '%FEAGOR_';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT /*+ first_rows  */*   FROM DUAL FEAGOR2
SELECT *   FROM DUAL FEAGOR1

2 rows selected.

SQL> disc
Disconnected from Oracle7 Server Release 7.3.4.0.0 - Production
With the distributed, replication and parallel query options
PL/SQL Release 2.3.4.0.0 - Production
18 мар 20, 14:55    [22101481]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
xtender
Member

Откуда: Мск
Сообщений: 5362
feagor
SQL*Plus,

Хотелось бы всё же найти пример, на котором хинт без пробела реально ломается
вы хотите странного.
Нарочито вычурная аналогия: Я всю жизнь пил из луж и ни разу еще не болел из-за этого. Покажите мне лужу, выпив из которой я заболею.
18 мар 20, 15:23    [22101504]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
Elic,

речь не про /* + HINT*/ vs /*+ HINT*/, а про /*+HINT*/ vs /*+ HINT*/

xtender,
аналогия хорошая, но тут ближе

я не пью из грязных луж(8), Я всю жизнь пил из чистых луж(10g+) и ни разу еще не болел из-за этого. Покажите мне чистую лужу, выпив из которой я заболею.
18 мар 20, 15:33    [22101512]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29738
feagor
речь не про /* + HINT*/ vs /*+ HINT*/, а про /*+HINT*/ vs /*+ HINT*/
+
SQL> exec open :c for select /*+first_rows */ * from dual feagor3;

PL/SQL procedure successfully completed.

SQL> select sql_text from v$sql where sql_text like '%FEAGOR_';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT /*+ irst_rows  */*   FROM DUAL FEAGOR3
SELECT /*+ first_rows  */*   FROM DUAL FEAGOR2
SELECT *   FROM DUAL FEAGOR1
18 мар 20, 15:45    [22101526]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
Elic,

feagor
для более актуальных версий 11,12,18,19

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 

declare c sys_refcursor;
begin
open c for select /*+first_rows */ * from dual feagor3;
end;
/

PL/SQL procedure successfully completed

select sql_text from v$sql where sql_text like '%FEAGOR_';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT /*+first_rows */ * FROM DUAL FEAGOR3

SQL> 


Сообщение было отредактировано: 18 мар 20, 15:56
18 мар 20, 15:49    [22101530]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 693
feagor,

Сегодня ты не поставишь пробел, а завтра захочешь впендюрить левую букву перед хинтом!
SQL> select --+ rewrite_or_error
  2  * from t;
* from t
       *
ERROR at line 2:
ORA-30393: a query block in the statement did not rewrite


SQL>
SQL> select --+a rewrite_or_error
  2  * from t;

        ID
----------
         1

По мотивам 20864930.

Странно само желаение писать криво если в доке четко указан формат хинта.

Вообще отсутствие пробела в хинте это все равно что ставить пробелы перед запятыми в тексте:
вроде и понятно, но выглядит омерзительно.
18 мар 20, 15:59    [22101539]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
-2-
Member

Откуда:
Сообщений: 15279
7554651
18 мар 20, 16:42    [22101576]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
Кобанчег
Странно само желание писать криво если в доке четко указан формат хинта.
См. ниже картинку, что написано в доке по Oracle Database 20c
https://docs.oracle.com/en/database/oracle/oracle-database/20/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E

Кобанчег
... ставить пробелы перед запятыми в тексте:
вроде и понятно, но выглядит омерзительно.
Это правда.

Вот так выглядит ,когда пробел стоит перед запятой.
Так выглядит , когда пробел и перед запятой , и после неё.
А еще противнее,когда вообще не ставят пробелы.

К сообщению приложен файл. Размер - 72Kb


Сообщение было отредактировано: 18 мар 20, 17:49
18 мар 20, 17:46    [22101642]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
2.6.3 Hints
https://docs.oracle.com/en/database/oracle/oracle-database/20/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E
- hint is one of the hints discussed in this section.
The space between the plus sign and the hint is optional.
If the comment contains multiple hints, then separate the hints by at least one space.
18 мар 20, 17:53    [22101651]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
-2-
Member

Откуда:
Сообщений: 15279
SQL*Plus,

SQL Reference не является авторитетом для PL/SQL.
18 мар 20, 18:11    [22101667]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
Эстетический вопрос использования пробела это больше вопрос вкуса.
Я привык не ставить, и мне нравится.
Спасибо за ссылку в доку, это получается только в 20 появилось?

Резюмируя, разницы между /*+HINT*/ vs /*+ HINT*/ в плане функционала никакой нет и это чисто вопрос вкуса.
Всем большое спасибо
18 мар 20, 18:20    [22101673]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17833
feagor
Резюмируя

Так скажу: грамотные люди опознают друг друга в кофейне, услышав "кофе" в мужском роде.
А опытные ораклоиды, повидавшие многие версии сервера - по пробелу в хинте.
18 мар 20, 18:26    [22101677]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
andrey_anonymous,

я все же считаю, что лучше понимать для чего этот пробел ставишь, чем слепо его ставить, потому что "опытные ораклоиды"
18 мар 20, 18:31    [22101681]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
-2-
SQL*Plus,

SQL Reference не является авторитетом для PL/SQL.
Это ваше имхо.

А я считаю, что является, поскольку в документе "Database PL/SQL Language Reference" нет отдельного описания хинтов (есть только про NOCOPY).

Кроме в одном месте явно написано:
Database PL/SQL Language Reference
13.3.1 Tune SQL Statements

The most common cause of slowness in PL/SQL programs is slow SQL statements.
To make SQL statements in a PL/SQL program as efficient as possible:
• Use appropriate indexes.
For details, see Oracle Database Performance Tuning Guide.

• Use query hints to avoid unnecessary full-table scans.
For details, see Oracle Database SQL Language Reference.
18 мар 20, 18:37    [22101686]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
feagor
Спасибо за ссылку в доку, это получается только в 20 появилось?

Не знаю. Не смотрел в других версиях.

Если интересно, посмотрите и нам расскажите, что в какой версии было по этой теме написано.
18 мар 20, 18:39    [22101689]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
feagor
andrey_anonymous,

я все же считаю, что лучше понимать для чего этот пробел ставишь, чем слепо его ставить, потому что "опытные ораклоиды"
Вам уже показали 22101526, что некоторые программисты Oracle считали,
что текст хинта следует начинать считывать с пятой позиции от начала комментария:
SQL> exec open :c for select /*+first_rows */ * from dual feagor3;
PL/SQL procedure successfully completed.

SQL> select sql_text from v$sql where sql_text like '%FEAGOR_';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT /*+ irst_rows  */*   FROM DUAL FEAGOR3


Дальше думайте сами, смотрите в зеркало и др.
18 мар 20, 18:46    [22101698]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
feagor
Member

Откуда: Москва
Сообщений: 244
SQL*Plus,
в 9i
https://docs.oracle.com/cd/B10501_01/server.920/a96540/sql_elements7a.htm#31715
в 10g
https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements006.htm#i35922
в 11g
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#SQLRF00219
в 12c тоже есть
https://docs.oracle.com/database/121/SQLRF/sql_elements006.htm#SQLRF00219
hint is one of the hints discussed in this section. The space between the plus sign and the hint is optional. If the comment contains multiple hints, then separate the hints by at least one space.
18 мар 20, 18:47    [22101700]     Ответить | Цитировать Сообщить модератору
 Re: Синтаксис хинтов, а именно необходимость пробела после +  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 7980
feagor,

ОК.
Спасибо за проведенное исследование! :-)
18 мар 20, 18:52    [22101711]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить