|
|
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
Есть один запрос, написанный 2 способами и EXPLAIN ANALYZE на него. Результат времени выполнения практически одинаков. Хотелось бы узнать - как же все-таки делать это правильнее: Вариант 1. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Вывод: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вариант 2. Код: plsql 1. 2. 3. 4. 5. Вывод: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Действительно, очень интересно узнать. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 23:27:24 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
R1K0, старайтесь IN избегать, лучше EXISTS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 23:55:36 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
вот еще парочка вариантов для размышлений :) Код: sql 1. 2. 3. 4. 5. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:59:23 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
Да, про JOIN я читал, но как-то олдскул уже в крови (да и, скорее всего, это не более чем syntax sugar, или я не прав?), а пример с WITH уж больно громоздкий имхо, Хотя, конечно, блочность упрощает отладку в особо крутых запросах. Мои вопрос скорее в том, что же в общем случае лучше - подзапросы или связь таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 18:17:52 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
R1K0Да, про JOIN я читал, но как-то олдскул уже в крови (да и, скорее всего, это не более чем syntax sugar, или я не прав?)до тех пор, пока не понадобится outer джоин R1K0Мои вопрос скорее в том, что же в общем случае лучше - подзапросы или связь таблиц?мне кажется, каждая запись уместна для своего случая. в данном примере, когда ограничения накладываются только на одну таблицу questdesc, а затем нужно выбрать соттветствующие записи из второй таблицы, затем соответствующие им из третьей и вернуть их... в этом случае самой понятной мне кажется запись через with. и надо не забывать про постгресовую специфику выполнения with запроса - предвычисление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 19:11:27 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
R1K0, Добрый день. Запрос 1 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. При смене СУБД работать будут не эффективно, особенно при увеличении результатов в подзапросе. Стараюсь уходить от таких запросов. Запрос 2 Код: sql 1. 2. 3. 4. 5. Я рекомендую его. Однако он эквивалентен объединению таблиц только через INNER JOIN. Запрос 3 Код: sql 1. 2. 3. 4. 5. Не совсем приятный запрос при использовании LEFT, RIGHT и FULL объединений. Не приятность в WHERE qd.name = 'Begin Training' . В данном случае нужно помнить, что WHERE .... действует на все таблицы. Из опыта могу посоветовать стараться не использовать LEFT и RIGHT, так как построить правильный запрос не всегда можно быстро. А если есть такая необходимость (использовать LEFT и RIGHT), старайтесь проверять мощности полученных множеств через count(). PS. Буду рад, если инфа окажется полезной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 05:31:51 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
R1K0Да, про JOIN я читал, но как-то олдскул уже в крови (да и, скорее всего, это не более чем syntax sugar, или я не прав?), а пример с WITH уж больно громоздкий имхо, Хотя, конечно, блочность упрощает отладку в особо крутых запросах. Мои вопрос скорее в том, что же в общем случае лучше - подзапросы или связь таблиц? R1K0 , синтаксическим подсластителем JOIN не являются. Запросы с ними выполняются намного быстрее. В вашем случае Код: sql 1. 2. 3. 4. 5. происходит сравнение каждой строки таблицы с каждой строкой другой таблицы. Зависимость для двух таблиц будет квадратичная, для трех - в кубе (при равном числе записей, ну а для разного количества - равно их произведению). Механизм Join'ов отличается, по факту он работает куда быстрее. Сужу по своему опыту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 13:58:23 |
|
||
|
К какому стилю запросов лучше стремиться:
|
|||
|---|---|---|---|
|
#18+
PCContraR1K0Да, про JOIN я читал, но как-то олдскул уже в крови (да и, скорее всего, это не более чем syntax sugar, или я не прав?), а пример с WITH уж больно громоздкий имхо, Хотя, конечно, блочность упрощает отладку в особо крутых запросах. Мои вопрос скорее в том, что же в общем случае лучше - подзапросы или связь таблиц? R1K0 , синтаксическим подсластителем JOIN не являются. Запросы с ними выполняются намного быстрее. В вашем случае Код: sql 1. 2. 3. 4. 5. происходит сравнение каждой строки таблицы с каждой строкой другой таблицы. Зависимость для двух таблиц будет квадратичная, для трех - в кубе (при равном числе записей, ну а для разного количества - равно их произведению). Механизм Join'ов отличается, по факту он работает куда быстрее. Сужу по своему опыту cross join (т.е. декарт) с фильтром where как правило распознаётся и планируется оптимизатором постгреса в точности так же , как INNER JOIN с соответствующим (фильтру кросса) условием связи в ON (using). само предложение (CROSS|INNER|OUTER) за скорость связывания не отвечает, никакой магии в слове INNER (или JOIN) нет за некое ускорение в разных случаях могут отвечать правильно созданные индексы + правильно (в соответствии с построенными индексами) наложенные условия. (можно написать условие [и в ON и в WHERE] так, что оптимизатор не сможет воспользоваться годным под него индексом) кроме всего прочего, join отличается от изначальной задачи (exists|in) в случае проверок по не ключевым полям. (по ключевым -- и планы [exists | inner], как правило, совпадают, иногда на удивление). И тогда потребует дополнения DISTINCT-ом, что всегда плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:29:55 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38594559&tid=1998781]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
206ms |
get topic data: |
33ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 525ms |

| 0 / 0 |
