PostgreSQL :: DISTINCT ON, VIEW
2 отговора
393 прегледа
PostgreSQL :: DISTINCT ON, VIEW
Както е написано в документацията на PostgreSQL за DISTINCT:
"The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group."
Въпреки че това ми дава неограничена свобода в начина, по който искам да стане орязването, все пак ме ограничава от гледна точка на крайното подреждане. Както е в моя случай, искам да направи орязването, подреждайки по първа и втора колона, но да покаже крайния резултат подреден по трета или N-та колона. Единственото до което успях да стигна е да създавам VIEW с DISTINCT стойностите, всеки път, когато искам да подреждам по други колони и след това да си работя с VIEW-то...което ми се вижда леко неефикасно. Няма ли някакъв друг начин?
И всъщност, как точно е осъществено VIEW-то на ниско ниво? Всеки път се създава временна таблица или има и някакви оптимизатори за кеширане и т.н.?
Everything louder than everything else...
"The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group."
Въпреки че това ми дава неограничена свобода в начина, по който искам да стане орязването, все пак ме ограничава от гледна точка на крайното подреждане. Както е в моя случай, искам да направи орязването, подреждайки по първа и втора колона, но да покаже крайния резултат подреден по трета или N-та колона. Единственото до което успях да стигна е да създавам VIEW с DISTINCT стойностите, всеки път, когато искам да подреждам по други колони и след това да си работя с VIEW-то...което ми се вижда леко неефикасно. Няма ли някакъв друг начин?
И всъщност, как точно е осъществено VIEW-то на ниско ниво? Всеки път се създава временна таблица или има и някакви оптимизатори за кеширане и т.н.?
Everything louder than everything else...
Редактирано от Dakota на
Re: PostgreSQL :: DISTINCT ON, VIEW
може да го направиш или с VIEW както си се сетил, или с под заявка
SELECT * FROM (твоята заявка, която избира всичко) ORDER BY квото_трябва
VIEW-то работи просто като предварително е анализирана заявката и е направен query plan, и при сложни заявки би било маааалко по-бързо, защото query plan-а ще е избран предварително, но това не винаги е така, защото при добавяне на условия, ако е реализирано без view, в някои случаи може да се открие по-добър query plan (общо взето VIEW-то е за улеснение на програмиста и рядко води до съществени скоростни изменения, но ако доведе, те може да са и в двете посоки)
SELECT * FROM (твоята заявка, която избира всичко) ORDER BY квото_трябва
VIEW-то работи просто като предварително е анализирана заявката и е направен query plan, и при сложни заявки би било маааалко по-бързо, защото query plan-а ще е избран предварително, но това не винаги е така, защото при добавяне на условия, ако е реализирано без view, в някои случаи може да се открие по-добър query plan (общо взето VIEW-то е за улеснение на програмиста и рядко води до съществени скоростни изменения, но ако доведе, те може да са и в двете посоки)
Re: PostgreSQL :: DISTINCT ON, VIEW
Дааа...наистина за подзаявките не се бях сетил. Иначе това с предварителния query plan е също интересно - не е да ми звучи като нещо особено ключово, но за сложни заявки, както казваш, може би би било.
Благодаря.
Everything louder than everything else...
Благодаря.
Everything louder than everything else...