К слову, совсем недавно в Oracle-L я приводил пример, когда Join elimination наоборот приводит к худшему плану причем с большей стоимостью: gist.github.com/xtender/f0871ffa99b1413232e6
— преобразование вложенных подзапросов в join (тоже есть отдельный хинт unnest / no_unnest).
Кстати, в этих примерах с exists/in/not in эта трансформация уже была: сначала выполняется subquery unnesting и только потом join elimination.
Есть еще полезная трансформация, похожая на оба этих случая — coalesce subquery (хинты COALESCE_SQ/NO_COALESCE_SQ)
Этот способ трансформации запроса впервые появился в Oracle 10.2, но в достаточно ограниченном виде. Он поддерживал только inner join, написанный в традиционном (не-ANSI) стиле Oracle.
Непонятно, что речь? Вообще-то почти все ANSI-запросы трансформируются оптимизатором оракла в оракловые(исключений немного: native full outer join и outer с предикатами по столбцам двух и более разных таблиц).
Больше похоже, что вы напоролись на какую-то недоделку, баг или трансформацию с латералами.
я гольфил достаточно долго и много, совершенно разнообразных задач(и прямо тут на хабре даже один раз побеждал), но эта… просто феерически неинтересная.
неистово плюсую! задача реально настолько простая и лобовая, что и решать особо желания нет. хотя абсолютно уверено что у меня решение бы вместилось в стандартный однострочник( <=80 символов)
> cat 1.pl
#!/usr/bin/perl -pla0F'\n'
$c=$F[0];$p[0]=Erdos;$_=Inf;for$i(0..@F){@_=grep{"$_~$p[$i]"=~/(\b\w+\b).*~.*\b\1\b/}@F;$p[$i+1]="@_"=~$c?($_=$i)&last:"@_"}
>
>
> cat tests/2.txt
Smith
Smith, Martin, Erdos: Newtonian forms of prime factor matrices
Erdos, Reisig: Stuttering in petri nets
Smith, Chen: First oder derivates in structured programming
Jablonski, Hsueh: Selfstabilizing data structures
>
>
> cat tests/2.txt | ./1.pl
1 >
А пример теста можно? По ссылке из топика все тесты проходит, поэтому я и отталкивался от этого, т.к. когда я придумал свой тест в первый раз, то половина решений из топика не проходили его.
Александр, молодец!
gist.github.com/xtender/f0871ffa99b1413232e6
Кстати, в этих примерах с exists/in/not in эта трансформация уже была: сначала выполняется subquery unnesting и только потом join elimination.
Есть еще полезная трансформация, похожая на оба этих случая — coalesce subquery (хинты COALESCE_SQ/NO_COALESCE_SQ)
Больше похоже, что вы напоролись на какую-то недоделку, баг или трансформацию с латералами.
C 11g есть вьюха v$sql_hint, в ней можете посмотреть остальные хинты с подробной информацией.
Еще подбробнее можно с v$sql_feature: blog.tanelpoder.com/2013/04/01/understanding-what-a-hint-affects-using-the-vsql_feature-views/