| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / Oracle |
![]() |
||
| Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
|
--Eugene-- Member Откуда: Санкт-Петербург Сообщений: 1121 |
Простите за, возможно, дурацкий вопрос, но Допустим, есть два запроса: первый select * from net_element where id = :x ---------------------------------------------------------------------------------------------- и второй select * from net_element where id = null ---------------------------------------------------------------------------------- вопрос: поймет ли СУБД, что не надо ничего делать в случае, если :X=NULL ? |
| 31 янв 13, 15:49 [13857852] Ответить | Цитировать Сообщить модератору | |
|
Кристобаль Хозевич Member Откуда: тутошний Сообщений: 103 |
Даже не сомневайся. |
||
| 31 янв 13, 16:14 [13858018] Ответить | Цитировать Сообщить модератору | |||
|
Zloxa Member Откуда: СССР ☭ Сообщений: 948 |
|
|||
| 31 янв 13, 16:27 [13858084] Ответить | Цитировать Сообщить модератору | ||||
|
dbms_photoshop Member Откуда: Ницца Сообщений: 2230 |
--Eugene--, Выполни запрос со статистиками времени выполнения и посмотри сколько раз стартанул (Starts) пункта плана (2 - TABLE ACCESS FULL) во втором случае. |
| 31 янв 13, 16:30 [13858102] Ответить | Цитировать Сообщить модератору | |
|
xtender Member Откуда: Мск Сообщений: 2173 |
Помимо наличия фильтра, который зависит от типа предикатов, количество "работы" еще зависит и от типа операции, например, access или filter предикат, хочешь быть уверен добавляй отдельный предикат ":X is not null"
|
|
| 31 янв 13, 17:49 [13858410] Ответить | Цитировать Сообщить модератору | ||
|
ranger@VR6 Member Откуда: Moscow Сообщений: 289 |
тысяча чертей, каналья, не могу не согласиться :) ranger. |
||||
| 31 янв 13, 17:54 [13858445] Ответить | Цитировать Сообщить модератору | |||||
|
--Eugene-- Member Откуда: Санкт-Петербург Сообщений: 1121 |
собственно, вопрос был - в частности - в том, нужно ли в запросselect * from net_element where id = :xдобавлять дополнительный предикат :x is not null чтобы избежать ненужных INDEX SCAN-ов и TABLE ACCESS-ов select * from net_element where :x is not null and id = :x? а фраза
несколько более убедительно звучит аргумент пользователя Zloxa, основанный на статистике но хотелось бы почитать об этом The Fucking Manual (или хоть какой-то более-менее официальный текст), если кто знает спасибо |
||
| 1 фев 13, 00:02 [13859732] Ответить | Цитировать Сообщить модератору | |||
|
xtender Member Откуда: Мск Сообщений: 2173 |
--Eugene--, Даже не знаю что и сказать... вроде и ответ дал и пример привел, что тебе не убедительно-то? |
| 1 фев 13, 00:24 [13859766] Ответить | Цитировать Сообщить модератору | |
|
xtender Member Откуда: Мск Сообщений: 2173 |
|
||
| 1 фев 13, 00:59 [13859852] Ответить | Цитировать Сообщить модератору | |||
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
--Eugene--, твой пример в первом посте некорректный, т.к. во втором запросе не используется bind переменная, соответственно в плане видим 1 - filter(NULL IS NOT NULL), который однозначно говорит что работы никакой выполняться не будет. В случае с bind переменной такого фильтра, естественно, не будет и возможны варианты.
|
||
| 1 фев 13, 02:13 [13859973] Ответить | Цитировать Сообщить модератору | |||
|
--Eugene-- Member Откуда: Санкт-Петербург Сообщений: 1121 |
а вот про то как он работает с биндом, который NULL - про это и вопрос |
||
| 1 фев 13, 08:33 [13860115] Ответить | Цитировать Сообщить модератору | |||
|
Zloxa Member Откуда: СССР ☭ Сообщений: 948 |
Ага, я тоже не понял откуда там гетсы взялись. В моем примере не было уника. Если поставить по полю ПК, то в случае, если параметр из нулл, 0 гетсов. Если ставить уник на nullable поле - не пробовал.
Почему естественно? |
||||||
| 1 фев 13, 10:13 [13860402] Ответить | Цитировать Сообщить модератору | |||||||
|
Zloxa Member Откуда: СССР ☭ Сообщений: 948 |
Например, емнип, при использовании between оптимайзер добавляет фильтр, чтоб если знечение первого бинда больше второго, ничего не делать. |
||
| 1 фев 13, 10:16 [13860410] Ответить | Цитировать Сообщить модератору | |||
|
--Eugene-- Member Откуда: Санкт-Петербург Сообщений: 1121 |
имеется в виду, что tab.col - как раз одна из таких NON-NULLABLE колонок |
||
| 1 фев 13, 10:42 [13860531] Ответить | Цитировать Сообщить модератору | |||
|
Zloxa Member Откуда: СССР ☭ Сообщений: 948 |
--Eugene--, тут могу апеллировать только к личному опыту. Не припомню чтобы мне доводилось так подстраховываться, не припомню, чтобы мне приходилось в этом раскаиваться. А гарантии, как известно, дает только страховой полис :D |
| 1 фев 13, 11:33 [13860774] Ответить | Цитировать Сообщить модератору | |
|
usolcew Member Откуда: Россия Сообщений: 46 |
--Eugene--, >> а можно ли быть уверенным в том, что при поиске по любому NOT NULL-полю (tab.col = :X), в случае, когда :X IS NULL СУБД поймет, что не надо ничего делать? нет >> или нужно добавлять этот предикат в запрос для подстраховки (типа :X is not null and tab.col = :X)? или проиндексировать
|
|
| 1 фев 13, 15:27 [13862482] Ответить | Цитировать Сообщить модератору | ||
|
wurdu Member Откуда: Владивосток Сообщений: 3752 |
Тогда другой тесткейс:SQL> create table xt_test as select 1 i from dual; Table created. SQL> exec dbms_stats.gather_table_stats('','XT_TEST'); PL/SQL procedure successfully completed. SQL> var a number; SQL> select * from xt_test where i=:a; no rows selected Execution Plan ---------------------------------------------------------- Plan hash value: 1457378020 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 3 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| XT_TEST | 1 | 3 | 2 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("I"=TO_NUMBER(:A)) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 281 bytes sent via SQL*Net to client 408 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed |
| 1 фев 13, 15:53 [13862706] Ответить | Цитировать Сообщить модератору | |
|
--Eugene-- Member Откуда: Санкт-Петербург Сообщений: 1121 |
usolcew, wurdu, вот я о том и говорю - хер проссыш когда он читает, когда нет и надо ли че-то делать чтобы не читал |
| 1 фев 13, 17:27 [13863381] Ответить | Цитировать Сообщить модератору | |
|
usolcew Member Откуда: Россия Сообщений: 46 |
wurdu, какая у Вас версия? на 11.2.0.1: 11.2.0.1.ORCL112@SCOTT SQL> select * from xt_test where i=:a; no rows selected Elapsed: 00:00:00.01 Execution Plan ---------------------------------------------------------- Plan hash value: 1457378020 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 3 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| XT_TEST | 1 | 3 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("I"=TO_NUMBER(:A)) Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 1 consistent gets 0 physical reads |
| 1 фев 13, 17:57 [13863577] Ответить | Цитировать Сообщить модератору | |
|
usolcew Member Откуда: Россия Сообщений: 46 |
в 11.2.0.3 также получил:Statistics ---------------------------------------------------------- 0 recursive calls [color=green]0 db block gets[/color] 0 consistent gets 0 physical reads обновляться ;) |
| 1 фев 13, 18:46 [13863766] Ответить | Цитировать Сообщить модератору | |
|
xtender Member Откуда: Мск Сообщений: 2173 |
usolcew, ну у меня и на 11.2.0.3 та же ситуевина:
|
|
| 1 фев 13, 19:04 [13863831] Ответить | Цитировать Сообщить модератору | ||
|
dbms_photoshop Member Откуда: Ницца Сообщений: 2230 |
|
||
| 4 фев 13, 11:07 [13870974] Ответить | Цитировать Сообщить модератору | |||
|
usolcew Member Откуда: Россия Сообщений: 46 |
dbms_photoshop сорри, упустил, к этому моменту индекса, конечно уже нет: SQL> drop index I_T1; Index dropped. При наличии индекса блоки разумно не читаются независимо от наличия констрэйнта, а вот наличие констрэйнта не гарантирует исключения избыточных чтений - идея была такая |
| 4 фев 13, 11:26 [13871105] Ответить | Цитировать Сообщить модератору | |
|
dbms_photoshop Member Откуда: Ницца Сообщений: 2230 |
|
||
| 4 фев 13, 11:57 [13871311] Ответить | Цитировать Сообщить модератору | |||
|
dbms_photoshop Member Откуда: Ницца Сообщений: 2230 |
|
||
| 4 фев 13, 11:59 [13871326] Ответить | Цитировать Сообщить модератору | |||
| Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
| Все форумы / Oracle | ![]() |
|