Res: [oracle_br] Full Table Scan, SIM ou NÃO ?
Depende da quantidade de linhas que você precisa retornar. De acordo com o plano de execução que você mandou, o Oracle procura no indice por 1 registro, pega o rowid e com esse rowid ele busca apenas 1 registro na tabela. Provavelmente ele analisou que é mais rapido ler o indice para encontrar 1 rowid e depois ir direto nesse rowid na tabela, sem ter que ler as milhoes de linhas. Lembrando se o retorno for pequeno, vale o indice, se for muitos registros (quase a tabela inteira) vale o full table scan, num meio termo talvez teria que apelar para outras coisas como tabela particionada ou materialized view, depende da situação De: Evandro Giachetto Para: oracle_br@yahoogrupos.com.br Enviadas: Ter, Outubro 13, 2009 9:46:37 AM Assunto: Re: [oracle_br] Full Table Scan, SIM ou NÃO? Na verdade, o oracle se baseia nas estatísticas de determinado índice para saber se utilizará ou não de full table scan. Ele verifica se, a quantidade de registros que retornará utilizando determinado índice é maior que uma porcentagem do total da tabela (que não me lembro agora). Se for maior, compensa ele utilizar full table scan, senão o índice. Att. Evandro Giachetto Oracle Certified Associate evan...@clickintera tiva.com. br 2009/10/13 Jairo Azevedo > > > Se a sua tabela possui menos de 400 registros, um tableScan tem o mesmo > efeito que o indice (ou de repente pode ser ateh melhor que o indice!) > Para tabelas com tamanho superior de registros, o recomendavel é que o > otimizador opte pelo índice e depois a página de dados. > > 2009/10/13 fsilva6 > > > > > > > > Fala galera, tudo beleza? > > > > Estou com uma pequena duvida. Bom tenho uma mega tabela com 20 milhões de > > registros. Ao verificar o plano de execução pude identificar que o oracle > > decidiu acessar o index e depois a tabela, como não estou conseguindo > > acessar diretamente o index não seria melhor fazer um full table scan na > > tabela ao invés de fazer dois acessos (index e tabela)? > > > > 27 TABLE ACCESS BY INDEX ROWID TABLE ODS.ODS_CONTR_ SERVICES_ CAP > > 26 INDEX FULL SCAN INDEX (UNIQUE) ODS.PK_ODS_CONTR_ SERVICES_ CAP > > > > > > > > -- > Jairo Azevedo > jsouza...@gmail. com > protheus_lp@ yahoo.com. br > (21) -6492 > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas] Veja quais são os assuntos do momento no Yahoo! +Buscados http://br.maisbuscados.yahoo.com [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Full Table Scan, SIM ou NÃO?
Na verdade, o oracle se baseia nas estatísticas de determinado índice para saber se utilizará ou não de full table scan. Ele verifica se, a quantidade de registros que retornará utilizando determinado índice é maior que uma porcentagem do total da tabela (que não me lembro agora). Se for maior, compensa ele utilizar full table scan, senão o índice. Att. Evandro Giachetto Oracle Certified Associate evan...@clickinterativa.com.br 2009/10/13 Jairo Azevedo > > > Se a sua tabela possui menos de 400 registros, um tableScan tem o mesmo > efeito que o indice (ou de repente pode ser ateh melhor que o indice!) > Para tabelas com tamanho superior de registros, o recomendavel é que o > otimizador opte pelo índice e depois a página de dados. > > 2009/10/13 fsilva6 > > > > > > > > Fala galera, tudo beleza? > > > > Estou com uma pequena duvida. Bom tenho uma mega tabela com 20 milhões de > > registros. Ao verificar o plano de execução pude identificar que o oracle > > decidiu acessar o index e depois a tabela, como não estou conseguindo > > acessar diretamente o index não seria melhor fazer um full table scan na > > tabela ao invés de fazer dois acessos (index e tabela)? > > > > 27 TABLE ACCESS BY INDEX ROWID TABLE ODS.ODS_CONTR_SERVICES_CAP > > 26 INDEX FULL SCAN INDEX (UNIQUE) ODS.PK_ODS_CONTR_SERVICES_CAP > > > > > > > > -- > Jairo Azevedo > jsouza...@gmail.com > protheus...@yahoo.com.br > (21) -6492 > > [As partes desta mensagem que não continham texto foram removidas] > > > [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] Full Table Scan, SIM ou NÃO?
Se a sua tabela possui menos de 400 registros, um tableScan tem o mesmo efeito que o indice (ou de repente pode ser ateh melhor que o indice!) Para tabelas com tamanho superior de registros, o recomendavel é que o otimizador opte pelo índice e depois a página de dados. 2009/10/13 fsilva6 > > > Fala galera, tudo beleza? > > Estou com uma pequena duvida. Bom tenho uma mega tabela com 20 milhões de > registros. Ao verificar o plano de execução pude identificar que o oracle > decidiu acessar o index e depois a tabela, como não estou conseguindo > acessar diretamente o index não seria melhor fazer um full table scan na > tabela ao invés de fazer dois acessos (index e tabela)? > > 27 TABLE ACCESS BY INDEX ROWID TABLE ODS.ODS_CONTR_SERVICES_CAP > 26 INDEX FULL SCAN INDEX (UNIQUE) ODS.PK_ODS_CONTR_SERVICES_CAP > > > -- Jairo Azevedo jsouza...@gmail.com protheus...@yahoo.com.br (21) -6492 [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] Full Table Scan, SIM ou NÃO?
Fala galera, tudo beleza? Estou com uma pequena duvida. Bom tenho uma mega tabela com 20 milhões de registros. Ao verificar o plano de execução pude identificar que o oracle decidiu acessar o index e depois a tabela, como não estou conseguindo acessar diretamente o index não seria melhor fazer um full table scan na tabela ao invés de fazer dois acessos (index e tabela)? 27 TABLE ACCESS BY INDEX ROWID TABLE ODS.ODS_CONTR_SERVICES_CAP 26 INDEX FULL SCAN INDEX (UNIQUE) ODS.PK_ODS_CONTR_SERVICES_CAP
Re: [oracle_br] FULL TABLE..
Obrigado Marcelo pela dica, não conhecia essa. Então, coloquei o Ano e agora ficou bom o custo da minha consulta. - Original Message - From: Marcelo To: oracle_br@yahoogrupos.com.br Sent: Tuesday, September 15, 2009 8:43 AM Subject: RE: [oracle_br] FULL TABLE.. Marcio, Uma dica que eu aprendi no dia-a-dia de SQL. Sempre comece as clausulas do WHERE de baixo para cima seguindo um índice. Como você mencionou que o índice começa pelo campo ANO, não vi este campo no where, portanto não vai ter jeito, vai ser full scan mesmo. select ht01.un, ht01.periodo_mov as dt_mov, sum(nvl(ht01.vr_ap, 0)) as vr_ap, sum(nvl(ht01.vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) and ht01.periodo_mov between :7 and :8 and ht01.tipo = 4 AND ANO = 2009 -- ou então usar IN(2009,2008) não use between quando possível pois custa mais group by ht01.un, ht01.periodo_mov From: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] On Behalf Of Márcio Ricardo Alves da Silva Sent: Tuesday, September 15, 2009 8:20 AM To: oracle_br@yahoogrupos.com.br; gpora...@yahoogrupos.com.br Subject: [oracle_br] FULL TABLE.. Bom dia! Tenho um select que está fazendo FULL TABLE, e a tabela que está fazendo FULL TABLE tem 50 milhões de registros, o select é esse: select ht01.un, ht01.periodo_mov as dt_mov, sum(nvl(ht01.vr_ap, 0)) as vr_ap, sum(nvl(ht01.vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) and ht01.periodo_mov between :7 and :8 and ht01.tipo = 4 group by ht01.un ,ht01.periodo_mov E tem esse indice criado na tabela. ANO, TIPO, PERIODO_MOV, UN, REGIONAL, REGIAO, EQUIPE. ROTA, CLIENTE, PROD Forcei o indice com o hint, e o custo dobrou. Onde tem a numeração, são as bind variables, acho que o problema é bind :5 is null. Alguém tem alguma dica? Grato. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
RE: [oracle_br] FULL TABLE..
Marcio, Uma dica que eu aprendi no dia-a-dia de SQL. Sempre comece as clausulas do WHERE de baixo para cima seguindo um índice. Como você mencionou que o índice começa pelo campo ANO, não vi este campo no where, portanto não vai ter jeito, vai ser full scan mesmo. select ht01.un, ht01.periodo_mov as dt_mov, sum(nvl(ht01.vr_ap, 0)) as vr_ap, sum(nvl(ht01.vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) and ht01.periodo_mov between :7 and :8 and ht01.tipo = 4 AND ANO = 2009 -- ou então usar IN(2009,2008) não use between quando possível pois custa mais group by ht01.un, ht01.periodo_mov From: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] On Behalf Of Márcio Ricardo Alves da Silva Sent: Tuesday, September 15, 2009 8:20 AM To: oracle_br@yahoogrupos.com.br; gpora...@yahoogrupos.com.br Subject: [oracle_br] FULL TABLE.. Bom dia! Tenho um select que está fazendo FULL TABLE, e a tabela que está fazendo FULL TABLE tem 50 milhões de registros, o select é esse: select ht01.un, ht01.periodo_mov as dt_mov, sum(nvl(ht01.vr_ap, 0)) as vr_ap, sum(nvl(ht01.vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) and ht01.periodo_mov between :7 and :8 and ht01.tipo = 4 group by ht01.un ,ht01.periodo_mov E tem esse indice criado na tabela. ANO, TIPO, PERIODO_MOV, UN, REGIONAL, REGIAO, EQUIPE. ROTA, CLIENTE, PROD Forcei o indice com o hint, e o custo dobrou. Onde tem a numeração, são as bind variables, acho que o problema é bind :5 is null. Alguém tem alguma dica? Grato. [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] FULL TABLE..
Oi Elis, segui a sua sugestão. e o custo diminuiu, caiu de 208456 para 2253. Vou ver com os analistas se essa mudança atrapalha a regra de negócio. Márcio. - Original Message - From: Elis Azevedo Nery To: oracle_br@yahoogrupos.com.br Sent: Tuesday, September 15, 2009 8:33 AM Subject: Re: [oracle_br] FULL TABLE.. Olá Márcio! A cabeça do seu indice é ano, e me pareceu que você não está a passar o ano. Verifica se ao colocar este campo no where já usa o indice. Inté! Elis --- Em ter, 15/9/09, Márcio Ricardo Alves da Silva escreveu: De: Márcio Ricardo Alves da Silva Assunto: [oracle_br] FULL TABLE.. Para: oracle_br@yahoogrupos.com.br, gpora...@yahoogrupos.com.br Data: Terça-feira, 15 de Setembro de 2009, 12:19 Bom dia! Tenho um select que está fazendo FULL TABLE, e a tabela que está fazendo FULL TABLE tem 50 milhões de registros, o select é esse: select ht01.un, ht01.periodo_ mov as dt_mov, sum(nvl(ht01. vr_ap, 0)) as vr_ap, sum(nvl(ht01. vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) and ht01.periodo_ mov between :7 and :8 and ht01.tipo = 4 group by ht01.un ,ht01.periodo_ mov E tem esse indice criado na tabela. ANO, TIPO, PERIODO_MOV, UN, REGIONAL, REGIAO, EQUIPE. ROTA, CLIENTE, PROD Forcei o indice com o hint, e o custo dobrou. Onde tem a numeração, são as bind variables, acho que o problema é bind :5 is null. Alguém tem alguma dica? Grato. [As partes desta mensagem que não continham texto foram removidas] __ Veja quais são os assuntos do momento no Yahoo! +Buscados http://br.maisbuscados.yahoo.com [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]
Re: [oracle_br] FULL TABLE..
Olá Márcio! A cabeça do seu indice é ano, e me pareceu que você não está a passar o ano. Verifica se ao colocar este campo no where já usa o indice. Inté! Elis --- Em ter, 15/9/09, Márcio Ricardo Alves da Silva escreveu: De: Márcio Ricardo Alves da Silva Assunto: [oracle_br] FULL TABLE.. Para: oracle_br@yahoogrupos.com.br, gpora...@yahoogrupos.com.br Data: Terça-feira, 15 de Setembro de 2009, 12:19 Bom dia! Tenho um select que está fazendo FULL TABLE, e a tabela que está fazendo FULL TABLE tem 50 milhões de registros, o select é esse: select ht01.un, ht01.periodo_ mov as dt_mov, sum(nvl(ht01. vr_ap, 0)) as vr_ap, sum(nvl(ht01. vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) andht01.periodo_ mov between :7 and :8 andht01.tipo = 4 group by ht01.un ,ht01.periodo_ mov E tem esse indice criado na tabela. ANO, TIPO, PERIODO_MOV, UN, REGIONAL, REGIAO, EQUIPE. ROTA, CLIENTE, PROD Forcei o indice com o hint, e o custo dobrou. Onde tem a numeração, são as bind variables, acho que o problema é bind :5 is null. Alguém tem alguma dica? Grato. [As partes desta mensagem que não continham texto foram removidas] Veja quais são os assuntos do momento no Yahoo! +Buscados http://br.maisbuscados.yahoo.com [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] FULL TABLE..
Bom dia! Tenho um select que está fazendo FULL TABLE, e a tabela que está fazendo FULL TABLE tem 50 milhões de registros, o select é esse: select ht01.un, ht01.periodo_mov as dt_mov, sum(nvl(ht01.vr_ap, 0)) as vr_ap, sum(nvl(ht01.vr_av, 0)) as vr_av from ht01_hist_venda ht01 where (:5 is null or ht01.un = :6) andht01.periodo_mov between :7 and :8 andht01.tipo = 4 group by ht01.un ,ht01.periodo_mov E tem esse indice criado na tabela. ANO, TIPO, PERIODO_MOV, UN, REGIONAL, REGIAO, EQUIPE. ROTA, CLIENTE, PROD Forcei o indice com o hint, e o custo dobrou. Onde tem a numeração, são as bind variables, acho que o problema é bind :5 is null. Alguém tem alguma dica? Grato. [As partes desta mensagem que não continham texto foram removidas]
RE: [oracle_br] Full table scans
Não tem como você pedir para ele te avisar quando faz cada full table scan. O que dá pra fazer é verificar nas estatísticas do banco (V$SYSSTAT por exemplo) quantos FULL SCANS já foram realizados. Mas, ainda que mal te pergunte, pra que você quer isso? Se você está partindo do pressuposto de que todo full scan é um erro, e por isso deve ser exterminado do banco, devo adiantar que isto está errado. O full table scan é uma opção de otimização plausível e esperada em várias situações, conforme já tem sido amplamente explicado pelos colegas aqui do grupo. []s Eduardo Claro EDS - Brazilian Solution Centre +55 (11) 4393-1276 mailto: [EMAIL PROTECTED] -Original Message- From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of thy_costa Sent: segunda-feira, 19 de dezembro de 2005 09:32 To: oracle_br@yahoogrupos.com.br Subject: [oracle_br] Full table scans Bom dia. Tem como fazer algo no banco ou algum procedimento que me avise sempre que o banco fizer um full table scan em determinada tabela? Agradeço qualquer ajuda. Thiago. -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --_ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --_ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
[oracle_br] Full table scans
Bom dia. Tem como fazer algo no banco ou algum procedimento que me avise sempre que o banco fizer um full table scan em determinada tabela? Agradeço qualquer ajuda. Thiago. -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --_ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html