Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO

2006-01-10 Por tôpico Marcelo Cauduro
Chiappa, acredita que ainda não rodou ?

naum consigo o FBI em RBO no ORacle 8i...

select * from v$version

Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
PL/SQL Release 8.1.7.4.0 - Production
CORE8.1.7.0.0Production
TNS for Linux: Version 8.1.7.4.0 - Production
NLSRTL Version 3.4.1.0.0 - Production

timed_statistics TRUE

Fiz um monte de alter session até mesmo sem saber o pq... para tentar ficar
igual aos seus parametros...

alter session set OPTIMIZER_MODE=rule ;

alter session set query_rewrite_enabled=TRUE

alter session set query_rewrite_integrity=TRUSTED

alter session set text_enable=TRUE

alter session set hash_join_enabled=true

alter session set timed_statistics=true

alter session set sql_trace=true

alter session set oracle_trace_enable=true

select name, value from v$parameter where
isdefault='FALSE'
ORDER BY NAME;

1background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
2compatible8.1.7
3control_files/u01/oracle/oradata/dvbco1/control01.ctl,
/u02/oracle/oradata/dvbco1/control02.ctl
4core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
5db_block_buffers2048
6db_block_size4096
7db_namedvbco1
8event36 trace name errorstack level 3
9hash_join_enabledTRUE
10instance_namedvbco1
11java_pool_size2500
12large_pool_size8192000
13log_buffer163840
14log_checkpoint_interval1
15log_checkpoint_timeout1800
16max_enabled_roles80
17open_cursors500
18os_authent_prefix
19processes350
20remote_login_passwordfileEXCLUSIVE
21rollback_segmentsR04, R01, R02, R03
22service_namesdvbco1
23shared_pool_reserved_size5033164
24shared_pool_size50331648
25sort_area_retained_size65536
26sort_area_size65536
27user_dump_dest/u01/app/oracle/admin/dvbco1/udump
--28utl_file_dir/home/ftpbis/*

select name, value from v$parameter --where
--isdefault='FALSE'
ORDER BY NAME;

1O7_DICTIONARY_ACCESSIBILITYTRUE
2active_instance_count
3always_anti_joinNESTED_LOOPS
4always_semi_joinstandard
5aq_tm_processes0
6audit_file_dest?/rdbms/audit
7audit_trailNONE
8background_core_dumppartial
9background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
10backup_tape_io_slavesFALSE
11bitmap_merge_area_size1048576
12blank_trimmingFALSE
13buffer_pool_keep
14buffer_pool_recycle
15commit_point_strength1
16compatible8.1.7
17control_file_record_keep_time7
18control_files/u01/oracle/oradata/dvbco1/control01.ctl,
/u02/oracle/oradata/dvbco1/control02.ctl
19core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
20cpu_count4
21create_bitmap_area_size8388608
22cursor_sharingEXACT
23cursor_space_for_timeFALSE
24db_block_buffers2048
25db_block_checkingFALSE
26db_block_checksumFALSE
27db_block_lru_latches2
28db_block_max_dirty_target2048
29db_block_size4096
30db_domain
31db_file_direct_io_count64
32db_file_multiblock_read_count8
33db_file_name_convert
34db_files200
35db_namedvbco1
36db_writer_processes1
37dblink_encrypt_loginFALSE
38dbwr_io_slaves0
39disk_asynch_ioTRUE
40distributed_transactions107
41dml_locks1716
42enqueue_resources1936
43event36 trace name errorstack level 3
44fast_start_io_target2048
45fast_start_parallel_rollbackLOW
46fixed_date
47gc_defer_time10
48gc_files_to_locks
49gc_releasable_locks0
50gc_rollback_locks0-1024=32!8REACH
51global_namesFALSE
52hash_area_size131072
53hash_join_enabledTRUE
54hash_multiblock_io_count0
55hi_shared_memory_address0
56hpux_sched_noage
57hs_autoregisterTRUE
58ifile
59instance_groups
60instance_namedvbco1
61instance_number0
62java_max_sessionspace_size0
63java_pool_size2500
64java_soft_sessionspace_limit0
65job_queue_interval60
66job_queue_processes0
67large_pool_size8192000
68license_max_sessions0
69license_max_users0
70license_sessions_warning0
71lm_locks12000
72lm_ress6000
73local_listener
74lock_name_space
75lock_sgaFALSE
76log_archive_dest
77log_archive_dest_1
78log_archive_dest_2
79log_archive_dest_3
80log_archive_dest_4
81log_archive_dest_5
82log_archive_dest_state_1enable
83log_archive_dest_state_2enable
84log_archive_dest_state_3enable
85log_archive_dest_state_4enable
86log_archive_dest_state_5enable
87log_archive_duplex_dest
88log_archive_format%t_%s.dbf
89log_archive_max_processes1
90

Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO

2006-01-10 Por tôpico Marcelo Cauduro
-- os params query_nn eu setei no init, e não via alter session

é isso mesmo, dei alter system e rodou...

Valeu.

On 1/10/06, jlchiappa [EMAIL PROTECTED] wrote:

  Duas coisas eu vejo aí :

 a) return sysdate : isso não vai funcionar, pois A CADA HORA, cfrme o
 relógio do sistema avança, o sysdate retorna um valor diferente !! SE
 vc olhar direitinho no meu exemplo, eu peço uma CONSTANTE, que aí SIM
 é sempre a mesma , return 0; no meu caso

 b) os params query_nn eu setei no init, e não via alter session

 []s

 Chiappa

 --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
 escreveu
 
  Chiappa, acredita que ainda não rodou ?
 
  naum consigo o FBI em RBO no ORacle 8i...
 
  select * from v$version
 
  Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
  PL/SQL Release 8.1.7.4.0 - Production
  CORE8.1.7.0.0Production
  TNS for Linux: Version 8.1.7.4.0 - Production
  NLSRTL Version 3.4.1.0.0 - Production
 
  timed_statistics TRUE
 
  Fiz um monte de alter session até mesmo sem saber o pq... para
 tentar ficar
  igual aos seus parametros...
 
  alter session set OPTIMIZER_MODE=rule ;
 
  alter session set query_rewrite_enabled=TRUE
 
  alter session set query_rewrite_integrity=TRUSTED
 
  alter session set text_enable=TRUE
 
  alter session set hash_join_enabled=true
 
  alter session set timed_statistics=true
 
  alter session set sql_trace=true
 
  alter session set oracle_trace_enable=true
 
  select name, value from v$parameter where
  isdefault='FALSE'
  ORDER BY NAME;
 
  1background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
  2compatible8.1.7
  3control_files/u01/oracle/oradata/dvbco1/control01.ctl,
  /u02/oracle/oradata/dvbco1/control02.ctl
  4core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
  5db_block_buffers2048
  6db_block_size4096
  7db_namedvbco1
  8event36 trace name errorstack level 3
  9hash_join_enabledTRUE
  10instance_namedvbco1
  11java_pool_size2500
  12large_pool_size8192000
  13log_buffer163840
  14log_checkpoint_interval1
  15log_checkpoint_timeout1800
  16max_enabled_roles80
  17open_cursors500
  18os_authent_prefix
  19processes350
  20remote_login_passwordfileEXCLUSIVE
  21rollback_segmentsR04, R01, R02, R03
  22service_namesdvbco1
  23shared_pool_reserved_size5033164
  24shared_pool_size50331648
  25sort_area_retained_size65536
  26sort_area_size65536
  27user_dump_dest/u01/app/oracle/admin/dvbco1/udump
  --28utl_file_dir/home/ftpbis/*
 
  select name, value from v$parameter --where
  --isdefault='FALSE'
  ORDER BY NAME;
 
  1O7_DICTIONARY_ACCESSIBILITYTRUE
  2active_instance_count
  3always_anti_joinNESTED_LOOPS
  4always_semi_joinstandard
  5aq_tm_processes0
  6audit_file_dest?/rdbms/audit
  7audit_trailNONE
  8background_core_dumppartial
  9background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
  10backup_tape_io_slavesFALSE
  11bitmap_merge_area_size1048576
  12blank_trimmingFALSE
  13buffer_pool_keep
  14buffer_pool_recycle
  15commit_point_strength1
  16compatible8.1.7
  17control_file_record_keep_time7
  18control_files/u01/oracle/oradata/dvbco1/control01.ctl,
  /u02/oracle/oradata/dvbco1/control02.ctl
  19core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
  20cpu_count4
  21create_bitmap_area_size8388608
  22cursor_sharingEXACT
  23cursor_space_for_timeFALSE
  24db_block_buffers2048
  25db_block_checkingFALSE
  26db_block_checksumFALSE
  27db_block_lru_latches2
  28db_block_max_dirty_target2048
  29db_block_size4096
  30db_domain
  31db_file_direct_io_count64
  32db_file_multiblock_read_count8
  33db_file_name_convert
  34db_files200
  35db_namedvbco1
  36db_writer_processes1
  37dblink_encrypt_loginFALSE
  38dbwr_io_slaves0
  39disk_asynch_ioTRUE
  40distributed_transactions107
  41dml_locks1716
  42enqueue_resources1936
  43event36 trace name errorstack level 3
  44fast_start_io_target2048
  45fast_start_parallel_rollbackLOW
  46fixed_date
  47gc_defer_time10
  48gc_files_to_locks
  49gc_releasable_locks0
  50gc_rollback_locks0-1024=32!8REACH
  51global_namesFALSE
  52hash_area_size131072
  53hash_join_enabledTRUE
  54hash_multiblock_io_count0
  55hi_shared_memory_address0
  56hpux_sched_noage
  57hs_autoregisterTRUE
  58ifile
  59instance_groups
  60instance_namedvbco1
  61instance_number0
  62java_max_sessionspace_size0

Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO

2006-01-10 Por tôpico Marcelo Cauduro
Obrigado Chiappa... vou realizar esse procedimento

On 1/10/06, jlchiappa [EMAIL PROTECTED] wrote:

  OK, só lembro que no 8i (onde não há spfile) um parâmetro alterado
 via ALTER SYSTEM não fica registrado no initfile, então só estará
 ativo enquanto o banco estiver, quando vc der um shutdown ele
 vai sumir, se vc quer usar isso permanentemente é alterar o
 initfile, também.

 []s

 Chiappa

 --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
 escreveu
 
  -- os params query_nn eu setei no init, e não via alter session
 
  é isso mesmo, dei alter system e rodou...
 
  Valeu.
 
  On 1/10/06, jlchiappa [EMAIL PROTECTED] wrote:
  
Duas coisas eu vejo aí :
  
   a) return sysdate : isso não vai funcionar, pois A CADA HORA,
 cfrme o
   relógio do sistema avança, o sysdate retorna um valor
 diferente !! SE
   vc olhar direitinho no meu exemplo, eu peço uma CONSTANTE, que aí
 SIM
   é sempre a mesma , return 0; no meu caso
  
   b) os params query_nn eu setei no init, e não via alter session
  
   []s
  
   Chiappa
  
   --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro
 [EMAIL PROTECTED]
   escreveu
   
Chiappa, acredita que ainda não rodou ?
   
naum consigo o FBI em RBO no ORacle 8i...
   
select * from v$version
   
Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
PL/SQL Release 8.1.7.4.0 - Production
CORE8.1.7.0.0Production
TNS for Linux: Version 8.1.7.4.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
   
timed_statistics TRUE
   
Fiz um monte de alter session até mesmo sem saber o pq... para
   tentar ficar
igual aos seus parametros...
   
alter session set OPTIMIZER_MODE=rule ;
   
alter session set query_rewrite_enabled=TRUE
   
alter session set query_rewrite_integrity=TRUSTED
   
alter session set text_enable=TRUE
   
alter session set hash_join_enabled=true
   
alter session set timed_statistics=true
   
alter session set sql_trace=true
   
alter session set oracle_trace_enable=true
   
select name, value from v$parameter where
isdefault='FALSE'
ORDER BY NAME;
   
1background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
2compatible8.1.7
3control_files/u01/oracle/oradata/dvbco1/control01.ctl,
/u02/oracle/oradata/dvbco1/control02.ctl
4core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
5db_block_buffers2048
6db_block_size4096
7db_namedvbco1
8event36 trace name errorstack level 3
9hash_join_enabledTRUE
10instance_namedvbco1
11java_pool_size2500
12large_pool_size8192000
13log_buffer163840
14log_checkpoint_interval1
15log_checkpoint_timeout1800
16max_enabled_roles80
17open_cursors500
18os_authent_prefix
19processes350
20remote_login_passwordfileEXCLUSIVE
21rollback_segmentsR04, R01, R02, R03
22service_namesdvbco1
23shared_pool_reserved_size5033164
24shared_pool_size50331648
25sort_area_retained_size65536
26sort_area_size65536
27user_dump_dest/u01/app/oracle/admin/dvbco1/udump
--28utl_file_dir/home/ftpbis/*
   
select name, value from v$parameter --where
--isdefault='FALSE'
ORDER BY NAME;
   
1O7_DICTIONARY_ACCESSIBILITYTRUE
2active_instance_count
3always_anti_joinNESTED_LOOPS
4always_semi_joinstandard
5aq_tm_processes0
6audit_file_dest?/rdbms/audit
7audit_trailNONE
8background_core_dumppartial
9background_dump_dest/u01/app/oracle/admin/dvbco1/bdump
10backup_tape_io_slavesFALSE
11bitmap_merge_area_size1048576
12blank_trimmingFALSE
13buffer_pool_keep
14buffer_pool_recycle
15commit_point_strength1
16compatible8.1.7
17control_file_record_keep_time7
18control_files/u01/oracle/oradata/dvbco1/control01.ctl,
/u02/oracle/oradata/dvbco1/control02.ctl
19core_dump_dest/u01/app/oracle/admin/dvbco1/cdump
20cpu_count4
21create_bitmap_area_size8388608
22cursor_sharingEXACT
23cursor_space_for_timeFALSE
24db_block_buffers2048
25db_block_checkingFALSE
26db_block_checksumFALSE
27db_block_lru_latches2
28db_block_max_dirty_target2048
29db_block_size4096
30db_domain
31db_file_direct_io_count64
32db_file_multiblock_read_count8
33db_file_name_convert
34db_files200
35db_namedvbco1
36db_writer_processes1
37dblink_encrypt_loginFALSE
38dbwr_io_slaves0
39disk_asynch_io

Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO

2006-01-07 Por tôpico Marcelo Cauduro
Chiappa muito obrigado pelo conceito esclarecido...
entretanto quero somente confirmar se eh isso que vc quis dizer... :

a tabela tem milhoes de registros
a minoria dos dados tem data_de_pagamento null.
e eu quero executar a seguinte querie
  select ID from tabela X where data_de_pagamento IS null
Pois eu quero trabalhar com os registro que nao foram pagos
Essa querie acima nao usuaria indice mas mesmo assim  naum seria
vantagem eu criar um indice que usasse a funcao abaixo, para fazer com que
no indice fiquem apenas as colunas nulas (a funcao retorna 0 para valores
nullos e nulos para nao nulos ) ?

create function func_test2 (a date) return number
   deterministic
   as
   begin
   --
   if a is not null then
   --
   return null;
   --
  end if;
  --
  return 0;
  --
  end;
  /

create index idx_test_f2 on tab_test(func_test2(data_de_pagamento));


On 1/7/06, jlchiappa [EMAIL PROTECTED] wrote:

 --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
 escreveu
 
  Valeu Chiappa, esse indices inventei na hora... sem sentido mesmo... soh
  para ver se a busca ia por eles...
  Muito Obrigado
 
  Mas só uma dúvida, vc disse q a melhor maneira de trabalhar com data
 é usar
  o between...
  ou seja,
  mesmo que eu sempre tenha um campo com data truncada para fazer
  comparacao, naum vale a pena criar o indice (eu digo de criar o
 indice. pq
  se eu der o trunc na data na hora da querie ele deixa de usar o
 indice) com
  a data truncada, mas sim usar o between ? eh isso mesmo ?

 Se a data está gravada truncada (ie, vc tem 100% de certeza que a
 porção hora não está nunca sendo gravada, portanto fica como
 00:00:00), vc simplesmente faz :

 WHERE campodata = TO_DATE('01/12/2005', 'dd/mm/')

 ou, se for com SYSDATE a comparação, se faz :

 WHERE campodata = TRUNC(sysdate);

 que aí usa o índice normal, TRUNC na constante é ok, o que não se
 recomenda é TRUNC no campo... Já se vc não tem certeza absoluta, aí
 sim é escrever o SQL com between de 00:00:00 à 23:59:59, sim, é isso
 mesmo... Pro caso de não ter certeza se tá truncado ou não, a sugestão
 é : *** DEIXE ** de usar o TRUNC, pois aí , além de não precisar de
 índice especial algum, vc deixa de ter uma função sendo aplicada a
 CADA registro pesquisado... É aquele negócio, é um tiquinho extra de
 nada de CPU que o bd gasta pra chamar o TRUNC em cada registro se vc o
 tiver no campo da tabela, MAS de repente multiplicando esse tiquinho
 por 1 milhão de regs, pode ser algo que valha a pena... Além do que,
 quanto MENOS partes móveis , quanto menos coisas vc tiver pra se
 preocupar, melhor...

 
  outra coisa , se a situacao fosse :
  um sistema de pagamentos que tem um campo data_de_pagamento, que
 só é
  preenchida quando o documento foi pago...
  e vc quer saber todos os que naum foram pagos, ou seja, todos os que tem
  nulo na data vencimento..
  se vc naum pudesse alterar a arquitetura da tabela... seria a melhor
 solucao
  criar um indice nessa coluna data_de_pagamento, um indice baseado numa
  funcao que, quando a coluna tiver valor, ou seja , foi efetuado o
 pagamento
  , retornasse null e, quando nao tiver sido efetuado, retornaria 1
  guardando nos indices apenas os naum pagos...
  eh uma ideia ridicula ou poderia ser usada ?

 Vc não ganharia nada, veja : se eu criar um índice btree comum nesse
 campo, ** naturalmente ** os registros onde esse campo-chave é null já
 **  não ** entram nele. o índice selectivo que eu porpus serve pra
 quando, DENTRO do universo grande de chaves não-nulas, vc quer indexar
 só ** alguns ** registros  : indexar TODAS as não-nulas apenas isso já
 acontece NATURALMENTE, é conceito de índices, se vc não tinha esse
 conceito passe a ter, exemplo :

 [EMAIL PROTECTED]:SQLcreate table tab_test(c1 varchar2(30), c2 number);

 Tabela criada.

 [EMAIL PROTECTED]:SQLinsert into tab_test (select null, object_id from
 all_objects);

 22045 linhas criadas.

 == ok, vamos inserir alguns não-nulos :

 [EMAIL PROTECTED]:SQLinsert into tab_test values ('AAA', 1);

 1 linha criada.

 [EMAIL PROTECTED]:SQLinsert into tab_test values ('BBB', 2);

 1 linha criada.


 [EMAIL PROTECTED]:SQLselect count(*) from tab_test where c1 is not null;

   COUNT(*)
 --
  2

 == tenho aqui o caso que vc propôs, ie : tenho uma porrada de
 valores-xchave null e só alguns poucos registros onde ele é not null.
 vamos criar os índices :

 [EMAIL PROTECTED]:SQLcreate index idx_test on tab_test(c1);

 Índice criado.

 [EMAIL PROTECTED]:SQLcreate function func_test (a char) return number
   2   deterministic
   3   as
   4   begin
   5   --
   6   if a is null then
   7   --
   8   return null;
   9   --
 10  end if;
 11  --
 12  return 0;
 13  --
 14  end;
 15  /

 Função criada.

 [EMAIL PROTECTED]:SQLcreate index idx_test_f on tab_test(func_test(c1));

 Índice criado.

 [EMAIL PROTECTED]:SQLanalyze table tab_test compute statistics for table
 for all indexes 

Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO

2006-01-07 Por tôpico Marcelo Cauduro
Perfeito Chiappa, obrigado.

On 1/7/06, jlchiappa [EMAIL PROTECTED] wrote:

 Exato, se realmente é uma minoria que tem null que te interessa, aí
 sim vale ** plenamente ** vc criar o índice na função que retorna 0
 pra quem tá nulo : é o conceito, vc usa o índice seletivo quando vc
 tem um PEQUENO conjunto que vc quer destacar dentro dum universo maior...
 Única coisa, vc teria que escrever a sua consulta com

 ...
 WHERE func_test2(data_de_pagamento) = 0

 pra aí sim ele achar os caras que estão nulos, é isso.

 []s

 Chiappa
 --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
 escreveu
 
  Chiappa muito obrigado pelo conceito esclarecido...
  entretanto quero somente confirmar se eh isso que vc quis dizer... :
 
  a tabela tem milhoes de registros
  a minoria dos dados tem data_de_pagamento null.
  e eu quero executar a seguinte querie
select ID from tabela X where data_de_pagamento IS
 null
  Pois eu quero trabalhar com os registro que nao foram pagos
  Essa querie acima nao usuaria indice mas mesmo assim  naum seria
  vantagem eu criar um indice que usasse a funcao abaixo, para fazer
 com que
  no indice fiquem apenas as colunas nulas (a funcao retorna 0 para
 valores
  nullos e nulos para nao nulos ) ?
 
  create function func_test2 (a date) return number
 deterministic
 as
 begin
 --
 if a is not null then
 --
 return null;
 --
end if;
--
return 0;
--
end;
/
 
  create index idx_test_f2 on tab_test(func_test2(data_de_pagamento));
 
 
  On 1/7/06, jlchiappa [EMAIL PROTECTED] wrote:
  
   --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
   escreveu
   
Valeu Chiappa, esse indices inventei na hora... sem sentido
 mesmo... soh
para ver se a busca ia por eles...
Muito Obrigado
   
Mas só uma dúvida, vc disse q a melhor maneira de trabalhar com data
   é usar
o between...
ou seja,
mesmo que eu sempre tenha um campo com data truncada para fazer
comparacao, naum vale a pena criar o indice (eu digo de criar o
   indice. pq
se eu der o trunc na data na hora da querie ele deixa de usar o
   indice) com
a data truncada, mas sim usar o between ? eh isso mesmo ?
  
   Se a data está gravada truncada (ie, vc tem 100% de certeza que a
   porção hora não está nunca sendo gravada, portanto fica como
   00:00:00), vc simplesmente faz :
  
   WHERE campodata = TO_DATE('01/12/2005', 'dd/mm/')
  
   ou, se for com SYSDATE a comparação, se faz :
  
   WHERE campodata = TRUNC(sysdate);
  
   que aí usa o índice normal, TRUNC na constante é ok, o que não se
   recomenda é TRUNC no campo... Já se vc não tem certeza absoluta, aí
   sim é escrever o SQL com between de 00:00:00 à 23:59:59, sim, é isso
   mesmo... Pro caso de não ter certeza se tá truncado ou não, a sugestão
   é : *** DEIXE ** de usar o TRUNC, pois aí , além de não precisar de
   índice especial algum, vc deixa de ter uma função sendo aplicada a
   CADA registro pesquisado... É aquele negócio, é um tiquinho extra de
   nada de CPU que o bd gasta pra chamar o TRUNC em cada registro se vc o
   tiver no campo da tabela, MAS de repente multiplicando esse tiquinho
   por 1 milhão de regs, pode ser algo que valha a pena... Além do que,
   quanto MENOS partes móveis , quanto menos coisas vc tiver pra se
   preocupar, melhor...
  
   
outra coisa , se a situacao fosse :
um sistema de pagamentos que tem um campo data_de_pagamento, que
   só é
preenchida quando o documento foi pago...
e vc quer saber todos os que naum foram pagos, ou seja, todos os
 que tem
nulo na data vencimento..
se vc naum pudesse alterar a arquitetura da tabela... seria a melhor
   solucao
criar um indice nessa coluna data_de_pagamento, um indice
 baseado numa
funcao que, quando a coluna tiver valor, ou seja , foi efetuado o
   pagamento
, retornasse null e, quando nao tiver sido efetuado, retornaria
 1
guardando nos indices apenas os naum pagos...
eh uma ideia ridicula ou poderia ser usada ?
  
   Vc não ganharia nada, veja : se eu criar um índice btree comum nesse
   campo, ** naturalmente ** os registros onde esse campo-chave é null já
   **  não ** entram nele. o índice selectivo que eu porpus serve pra
   quando, DENTRO do universo grande de chaves não-nulas, vc quer indexar
   só ** alguns ** registros  : indexar TODAS as não-nulas apenas isso já
   acontece NATURALMENTE, é conceito de índices, se vc não tinha esse
   conceito passe a ter, exemplo :
  
   [EMAIL PROTECTED]:SQLcreate table tab_test(c1 varchar2(30), c2 number);
  
   Tabela criada.
  
   [EMAIL PROTECTED]:SQLinsert into tab_test (select null, object_id from
   all_objects);
  
   22045 linhas criadas.
  
   == ok, vamos inserir alguns não-nulos :
  
   [EMAIL PROTECTED]:SQLinsert into tab_test values ('AAA', 1);
  
   1 linha criada.
  
   [EMAIL PROTECTED]:SQLinsert into tab_test values ('BBB', 2);

Re: Não rodou - Re: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona com RBO ?

2006-01-06 Por tôpico Marcelo Cauduro
Rodei o Insert, tem agora 70894 registros...
mas mesmo assim não foi

On 1/6/06, Marcio Portes [EMAIL PROTECTED] wrote:

  Incrementa a tabela... acho que essas 4 linhas estão no mesmo bloco.

 tenta ai.

 insert into a1234
 select sysdate
   from all_objects
 /
 commit;

 e tenta de novo.


 --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED]
 escreveu
 
  Chiappa, fui testar seu exemplo no 8i
 
  select * from v$version
 
  Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
  PL/SQL Release 8.1.7.4.0 - Production
  CORE8.1.7.0.0Production
  TNS for Linux: Version 8.1.7.4.0 - Production
  NLSRTL Version 3.4.1.0.0 - Production
 
  alter session set OPTIMIZER_MODE=RULE;
 
  select NAME,VALUE from V$PARAMETER where upper(name) like '%QUERY%'
  query_rewrite_enabledFALSE
  query_rewrite_integrityenforced
 
  -- Criei uma tabela para teste
 
  create table a1234 (a date);
 
  -- Criei uma funcao para testes
 
  create or replace function t_trunc(a date) return  date
 deterministic
  as
  begin
  --
if a is null then
--
  return null;
--
end if;
--
return trunc(a);
  --
  end;
 
  -- Criei dois indices para teste, um usando uma funcao do sistema
 (a trunc)
  e outro usando uma funcao criado por mim
 
  create index ITESTANDO1 on a1234(trunc(a))
  create index ITESTANDO2 on a1234(t_trunc(a))
 
  -- Inseri alguns registros
 
  insert into a1234 values (trunc(sysdate))
  insert into a1234 values (trunc(sysdate))
  insert into a1234 values (null)
  insert into a1234 values (null)
 
  -- Rodei as querys
 
  select /*+ INDEX(a1234 ITESTANDO1) */
  * from a1234
  where trunc(a)=sysdate
 
  TABLE ACCESS FULL
 
  select /*+ INDEX(a1234 ITESTANDO2) */
  * from a1234
  where t_trunc(a)=trunc(sysdate)
 
  TABLE ACCESS FULL
 
  Sabe o por que ?
 
  On 1/5/06, Alex Fabiano Ribeiro [EMAIL PROTECTED] wrote:
  
Muito legal o exemplo Chiappa!
  
   -Mensagem original-
   De: oracle_br@yahoogrupos.com.br
 [mailto:[EMAIL PROTECTED]
   nome de jlchiappa
   Enviada em: quinta-feira, 5 de janeiro de 2006 13:20
   Para: oracle_br@yahoogrupos.com.br
   Assunto: [oracle_br] Re: Indice Baseado em Funcao no 9I funciona
 com RBO
   ?
  
  
   Segue um exemplinho, pra não ficar tão no ar :
  
  
   [EMAIL PROTECTED]:SQLshow parameters query
  
   NAME TYPEVALUE
    --- ---
   query_rewrite_enabledstring  FALSE
   query_rewrite_integrity  string  enforced
  
   [EMAIL PROTECTED]:SQLalter session set OPTIMIZER_MODE=RULE;
  
   Sessão alterada.
  
   [EMAIL PROTECTED]:SQLselect empno, ename, comm, sal from emp;
  
EMPNO ENAMECOMM
 SAL
   -- -- -- -
 -
 7369 SMITH
 800
 7499 ALLEN 300
 1600
 7521 WARD  500
 1250
 7566 JONES
 2975
 7654 MARTIN   1400
 1250
 7698 BLAKE
 2850
 7782 CLARK
 2450
 7788 SCOTT
 3000
 7839 KING
 5000
 7844 TURNER  0
 1500
 7876 ADAMS
 1100
 7900 JAMES
 950
 7902 FORD
 3000
 7934 MILLER
 1300
  
   [EMAIL PROTECTED]:SQLcreate or replace function func_comm_not_nulo
 (P_COMM
   number) return number
 2  deterministic
 3  as
 4  BEGIN
 5 if P_COMM is null then
 6return null;
 7 end if;
 8 return 0;
 9  END;
   10  /
  
   Função criada.
  
   [EMAIL PROTECTED]:SQL
   [EMAIL PROTECTED]:SQLcreate index IDX_COMM_NOT_NULO on EMP
   (func_comm_not_nulo(COMM));
  
   Índice criado.
  
   [EMAIL PROTECTED]:SQLset autotrace on
   [EMAIL PROTECTED]:SQLselect * from emp where func_comm_not_nulo(COMM)
 =0;
  
EMPNO ENAME  JOB  MGR
   HIREDATESAL   COMM DEPTNO
   -- -- - -- ---
 - --
    -- --
 7499 ALLEN  SALESMAN7698
   20/02/81   1600300 30
 7521 WARD   SALESMAN7698
   22/02/81   1250500 30
 7654 MARTIN SALESMAN7698
   28/09/81   1250   1400 30
 7844 TURNER SALESMAN7698
   08/09/81   1500  0 30
  
  
   Plano de Execução
   --
  0  SELECT STATEMENT Optimizer=CHOOSE
  10   TABLE ACCESS (FULL) OF