|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
У меня есть многоэтажный запрос на пару сотен строк. В запросе есть такое выражение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Я хочу убрать CTE и в этих девяти джойнах использовать подзапросы, что позволит использовать более точные и простые выражения в where/on (а в некоторых случаях еще и избавиться от лишнего join в подзапросе). Но основная причина в том, что это позволит для получения исторических записей использовать не sysdate, а другое значение даты — на данный момент этого не требуется, но в будущем это может быть полезным. Но большие, но по пять вместо одного компактного DEPO к и без того громоздкому запросу добавится еще почти сотня строк. Есть ли у CTE преимущества в производительности/нагрузке? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 13:08 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Есть ли у CTE преимущества в производительности/нагрузке? Если смущает производительность, имеет смысл сравнить вариант без многократного джоина одного и того же. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 13:14 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B., какая причина переделок? ps можно попробовать многочисленные left join DEPO заменить одним left join DEPO со сложным он/вхере разультат оформить "unpivot"-ом ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 13:26 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Stax какая причина переделок? Одна из причин - мне (могут быть) нужны исторические данные на определенный момент, например на S1.CREATE_DATE. В варианте с CTE S1 ещё не определен. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 13:46 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B., Два варианта скриптов не рассматриваются (на текущую и архивную)? зы иногда архівные данные в других "исторических" таблицах ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 15:05 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Есть ли у CTE преимущества в производительности/нагрузке? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 16:10 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Stax можно попробовать многочисленные left join DEPO заменить одним left join DEPO со сложным он/вхере У меня это не удалось. У меня есть записи, у них есть дочерние записи, а у дочерних записей есть свои дочерние записи. И вот по этим дочерним записям второго уровня мне нужно получить определенное значение в соответствии с определенным приоритетом. xtender Главное отличие в том, что он может быть материализован, т.е. не придется вычитывать одни и те же данные из оригинальной таблицы по многу раз. Да, я это помню. Но у меня результат в CTE само по себе малострочный, запрос CTE возвращает буквально пару-тройку десятков записей. Да и в оригинальных таблицах записей немного (сотни или несколько сотен строк). Будет ли эффект от материализации такого небольшого фрагмента данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 16:38 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Но у меня результат в CTE само по себе малострочный, запрос CTE возвращает буквально пару-тройку десятков записей. Не столь важно сколько строк возвращает CTE а сколько времени это занимает. Кроме того материализация часто избавляет от необходимости предотвращения unnesting/expanding,... SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2019, 16:59 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
SY Не столь важно сколько строк возвращает CTE а сколько времени это занимает. Я и имел ввиду, что запрос внутри CTE простой, выполняется миллисекунды. Но основные моменты я понял. К сожалению, похоже что придется переносить из CTE в подзапросы, мне все же нужно получать исторические данные не на sysdate, а на момент из выборки данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2019, 09:52 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. К сожалению, похоже что придется переносить из CTE в подзапросы, мне все же нужно получать исторические данные не на sysdate, а на момент из выборки данных. -2- ... имеет смысл сравнить вариант без многократного джоина одного и того же. ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2019, 10:24 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Конечный вариант запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
То есть в CTE я получаю все версии данных, а нужную версию (на нужный момент) получаю при JOIN. Уж слишком громоздким получается запрос, если делать подзапросы. Но есть еще один небольшой вопрос. Для получения нужной версии данных я использую момент AA.MOMENT. Но это компромиссное значение, более правильным было бы использовать такое значение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Добавлять такое значение в критерии ON я не рискнул, серверу это может быть и безразлично, но я сам в таком запросе запутаюсь. Я хотел схитрить и сделать так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
но разумеется это не сработало, внутри подзапроса нет доступа к внешнему контексту (во всяком случае при использовании подзапроса внутри FROM). Не подскажите, есть ли способ для подобного случая, чтобы сложное выражение можно было представить как виртуальный столбец? Ну кроме как оформления всего предшествующего текста запроса в CTE или подзапрос, и присоединения DEPO к этому CTE/подзапросу? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2019, 12:46 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Не подскажите, есть ли способ для подобного случая, чтобы сложное выражение можно было представить как виртуальный столбец? гляньте, темка недавно была что-то типа латерал и "сложное выражение" зи по старинке s1,s2 в подзапрос аа и вычислить AA.MOMENT ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 09:54 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
если в CTE написать NVL(T_END, date '3999-12-31') T_END и NVL(TE_END, date '3999-12-31') TE_END то весь код станет немного короче и прозрачнее Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 13:15 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Использование функций разве не приведет к тому, что индекс не будет использоваться? К тому же between это закрытый диапазон, а у меня верхняя граница открытая. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 13:34 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Использование функций разве не приведет к тому, что индекс не будет использоваться? К тому же between это закрытый диапазон, а у меня верхняя граница открытая. А between - что, функция? Дайте пожалуйста ссылку почитать. Закрытый диапазон для типа date решается выражением DZ2.T_END-1/86400 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 16:08 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
andrey_anonymous А between - что, функция? Функция это NVL. Если я индексированный столбец указываю внутри функции (да еще и недетерминированной), то индекс при сравнении результата использоваться не будет. А как сравнивать, с помощью < или between, уже значения не имеет. andrey_anonymous Закрытый диапазон для типа date решается выражением DZ2.T_END-1/86400 Это же некрасиво. А если время фиксируется с точностью до долей секунды? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 16:56 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Stax гляньте, темка недавно была что-то типа латерал и "сложное выражение" Почитал, любопытная возможность, я про нее и не слышал раньше. Но доступно с Oracle 12c, а у меня Oracle 10g. В моей версии доступно, похоже, только обрамление в подзапрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:02 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. andrey_anonymous А between - что, функция? Функция это NVL. Если я индексированный столбец указываю внутри функции (да еще и недетерминированной), то индекс при сравнении результата использоваться не будет. А у Вас оба атрибута проиндексированы, и дата начала, и дата завершения? - продемонстрируйте, как предполагаете использовать оба индекса для доступа к данным. - как предполагаете использовать индекс на t_end, если t_end допускает null? Alibek B. andrey_anonymous Закрытый диапазон для типа date решается выражением DZ2.T_END-1/86400 Это же некрасиво. А если время фиксируется с точностью до долей секунды? Если время фиксируется с точностью до долей секунды, то это уже не date :) Что касается красоты - вопрос дискуссионный. 1/86400, 1/1440 лично для меня уже много лет как хорошо узнаваемые и осмысленные паттерны. А вот разносить логически связанные условия даты на два отдельных выражения мне не очень нравится - это плохо читается в сложных запросах. Ну и последнее: если строите версионные объекты, то лучше проектировать их под between - т.е. не допускать null и пересечений на границах версий. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:18 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. Но доступно с Oracle 12c, а у меня Oracle 10g. попробовал через table(кажись была в десятке) но почему-то не видит d Код: plsql 1. 2. 3. 4. 5. 6. 7.
с латерал пашет Код: plsql 1. 2.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:23 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Stax Alibek B. у меня Oracle 10g. Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:35 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
andrey_anonymous, я пробую на 11-ке у Alibek B. наверняка ж есть left join так d видит Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:49 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
andrey_anonymous Ну и последнее: если строите версионные объекты, то лучше проектировать их под between - т.е. не допускать null и пересечений на границах версий. Полуоткрытые диапазоны мне кажутся намного более правильными и удобными, чем закрытые. Они не зависят от дискретности используемых значений. Если бы я проектировал таблицы, я бы оставил такой же принцип задания периода, просто сделал поле END обязательным (не допускающим null) и с дефолтным значением 9999-01-01. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 17:57 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. andrey_anonymous Ну и последнее: если строите версионные объекты, то лучше проектировать их под between - т.е. не допускать null и пересечений на границах версий. Полуоткрытые диапазоны мне кажутся ... с дефолтным значением 9999-01-01. Кажутся. Но не беда, со временем понимание придет. Ну и дефолт именно такой я бы не рекомендовал. Попробуйте создать range-partitioned интервальную таблицу с интервалом 1 день - поймете. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 18:10 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
andrey_anonymous Кажутся. Но не беда, со временем понимание придет. А какие будут аргументы? У меня (помимо "это красиво") в пользу полуоткрытых диапазонов идет то, что из них можно построить непрерывную цепочку версий, когда DATE_BEG следующей записи будет равно DATE_END предыдущей. А если диапазон будет закрытым, то как понять, между двумя соседними записями есть разрыв в одну секунду или это непрерывная запись? andrey_anonymous Попробуйте создать range-partitioned интервальную таблицу с интервалом 1 день - поймете. Это для больших таблиц и там в любом случае есть свои особенности, которые нужно учитывать в ущерб другим особенностям. А разве для partition-таблиц нет специальных значений "все что больше значения X складывать в секцию OTHER"? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 18:37 |
|
Есть ли у CTE преимущества перед подзапросом?
|
|||
---|---|---|---|
#18+
Alibek B. А разве для partition-таблиц нет специальных значений "все что больше значения X складывать в секцию OTHER"? С другой стороны, партиционирование range как раз пользует открытость справа less than. Alibek B. как понять, между двумя соседними записями есть разрыв в одну секунду или это непрерывная запись? По поводу "дискретности" стоит припомнить wm_period - он базируется на timestamp, но как раз с ненулевым временем плохоприменим. А ошибка в документации значения max_time повторяется из версии к версии и служит демонстрацией, как легко ошибиться в недозначенияхTable 3-1 Constants for Valid Time SupportThe maximum (latest) timestamp value supported by Workspace Manager. Currently the end of the day (11:59.999999000 pm) on 31-Dec-9999 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2019, 19:26 |
|
|
start [/forum/search_topic.php?author=%D0%9B%D0%B8%D0%BD%D0%B0%D0%A0&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 698ms |
total: | 875ms |
0 / 0 |