Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Возник следующий вопрос: есть некий кусок кода вида IF EXISTS (бла-бла-бла). Вариантов этого самого бал-бла-бла мне видится 3: 1) SELECT * FROM ... 2) SELECT FIRST 1 * FROM ... 3) SELECT FIRST 1 <FieldName> FROM ... (при условии, что <FieldName> входит в фильты/индексы которые зацепит SELECT) Собственно вопрос звучит так: есть ли разница между вариантами? Или оптимизатор и так сообразит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 15:25 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевВозник следующий вопрос: есть некий кусок кода вида IF EXISTS (бла-бла-бла). Вариантов этого самого бал-бла-бла мне видится 3: 1) SELECT * FROM ... 2) SELECT FIRST 1 * FROM ... 3) SELECT FIRST 1 <FieldName> FROM ... (при условии, что <FieldName> входит в фильты/индексы которые зацепит SELECT) Собственно вопрос звучит так: есть ли разница между вариантами? Или оптимизатор и так сообразит? imho: в SELECT FIRST 1 * FROM, звездочка лишнее, select first 1 1 from, и возможно в таблицу не пойдем, обойдемся индексом (Key-Only). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Еще можно так, если удобнее обязательно возвращать строку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 1 или 0 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 15:51 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
чуть в сторону (сравнение IN и EXISTS) но есть намеки и на твой вопрос (выделено мной) ============================= > What could be the difference between IN and EXISTS in an SQL. > Similarly NOT IN and NOT exists particularly in IDS 9.20. > Results wise both are same but any inside Info. They should be equivalent as to results but the EXISTS is generally much faster. (My experiments show 2 - 10 times faster.) This is because the IN requires the subquery to run to completion before it can be evaluated but the EXISTS need only return the first row to satisfy the condition . This is true of other RDBMS' as well. ( There was a good discussion of this in the latest [last?] Informix Tech Notes, Vol. 11, Issue 2, pp73, entitled "Optimizing Informix SQL: Examples and Analysis".) As for NOT IN vs NOT EXISTS, I haven't tested it but it would seem that the subquery would have to run to completion in either case and hence there should not be such a marked difference in query performance. Thank you, Lucky Leavell ============================= Т.е. похоже, что "оптимизатор и так сообразит" , но я бы особо не доверял :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 15:57 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
вроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливаться, в оракл чуть удобнее там в плане фраза stop видна, хотя стоимость естественно тоже дикая показывается): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 16:09 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
vasilisпохоже, что "оптимизатор и так сообразит" , но я бы особо не доверял :)Вот я и не доверяю :)) Но проверить сложно, решил спросить у тех кто в теме. Журавлев Денисвроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливатьсяА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 16:55 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :)Прошу прощения, я видимо неправильно понял изначальный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 17:03 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
А еще вот какой моент мне не очень понятен (хотя, возможно, я не слишком силен читать информиксовый explain) Журавлев Денис Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Еще можно так, если удобнее обязательно возвращать строку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Почему в первом случае Estimated Cost: 5, а во втором 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 18:00 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 18:27 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений Фадеев Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)...Запрос разный where tabid>99, tabid>999. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 20:06 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Оптимизатор не видит first и не понимает что нужна 1-я строка, поэтому для 100-й гарантии стоит писать first_rows. select {+first_rows} first 1 1 from systables where tabid>99 select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 20:11 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. мда 1(единичка) лучше * ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 11:58 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис.... select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999) FIRST_ROWS Optimization goal directive only allowed in top-level query. select {+first_rows} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 11:59 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Журавлев Денис.... select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999) FIRST_ROWS Optimization goal directive only allowed in top-level query. select {+first_rows} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999)Уф! Я окончательно потерялся! :)) Давайте я попробую задать вопрос еще раз (с учетом уже полученной информации)? Итак, есть два запроса (точнее два куска кода): 1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF; 2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF; Будет ли разница в скорости их выполнения (при условии, что <Table> достаточно "длинная", скажем несколько млн. записей)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 15:20 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений Фадеев... 1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF; 2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF; ...это spl или абстракция? 1. запрос может вернуть 200 полей и миллион строк, а если ваше приложение захочет отфетчить все? 2. второй запрос вернет или ноль или одну строку, причем одно поле, и если WHERE <Condition> попадает в индекс то в таблицу вообще не пойдем, т.е. стоимость будет 1...6(7). Просто спуск по btree индексу. Но для увеличения вероятности прохода по индексу рекомендую SELECT {+first_rows} FIRST 1 1 .... Но такой код (FIRST) не работает в spl. В общем второй вариант имеет меньший cost ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 15:37 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Евгений Фадеев... 1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF; 2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF; ...это spl или абстракция? 1. запрос может вернуть 200 полей и миллион строк, а если ваше приложение захочет отфетчить все? 2. второй запрос вернет или ноль или одну строку, причем одно поле, и если WHERE <Condition> попадает в индекс то в таблицу вообще не пойдем, т.е. стоимость будет 1...6(7). Просто спуск по btree индексу. Но для увеличения вероятности прохода по индексу рекомендую SELECT {+first_rows} FIRST 1 1 .... Но такой код (FIRST) не работает в spl. В общем второй вариант имеет меньший costЭто SPL (я поэтому и поправился про два куска кода). Про индексы я специально не упомянул (так как есть оба варианта - индексы покрывают/не покрывают <Condition>). Ну и разумеется это чуть упрощенный пример (то есть в реальности <Table> это не одна таблица, а несколько и <Condition> это не только фильтры, но и связки), но суть не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 15:48 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевЭто SPL (я поэтому и поправился про два куска кода). Про индексы я специально не упомянул (так как есть оба варианта - индексы покрывают/не покрывают <Condition>). Ну и разумеется это чуть упрощенный пример (то есть в реальности <Table> это не одна таблица, а несколько и <Condition> это не только фильтры, но и связки), но суть не меняется. тогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й. Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF; из эстетических соображений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 16:36 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
1-ка лучше Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 16:53 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Журавлев Денистогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й. Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF; из эстетических соображений.То есть смысла писать FIRST 1 1 - никакого? А можно план для такой (то есть с FIRST) процедурки глянуть? А то у меня нет такой возможности :(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 17:08 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевТо есть смысла писать FIRST 1 1 - никакого? А можно план для такой (то есть с FIRST) процедурки глянуть? охохоо, я же выше написал что использовать first в spl нельзя (Но такой код (FIRST) не работает в spl.). Код: plaintext 1. 2. 3. 4. Евгений Фадеев А то у меня нет такой возможности :((Что так? Нет доступа к файлам продакшина? И тестовый сервак собрать нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 17:15 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
да и смысла нет никакого, проверил: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 17:29 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Журавлев Денисда и смысла нет никакого, проверил: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 17:31 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Но что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 19:39 |
|
||
|
IF EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений ФадеевНо что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...версия какая информикса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 08:38 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=34303166&tid=1608455]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
77ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 449ms |

| 0 / 0 |
