Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que o Oracle varchar2 tem um tamanho obrigatório como parâmetro de definição?


Não, não é a mesma coisa.
  1. O comprimento da coluna é um metadado útil para desenvolvedores que criam telas.
  2. Ferramentas de consulta igualmente automáticas, como TOAD e SQL Developer, usam o comprimento da coluna ao renderizar resultados.
  3. O banco de dados usa o comprimento de uma variável ao alocar memória para coleções PL/SQL. À medida que a memória sai do PGA, o superdimensionamento da declaração da variável pode levar à falha de programas porque o servidor ficou sem memória.
  4. Existem problemas semelhantes com a declaração de variáveis ​​únicas em programas PL/SQL, mas as coleções tendem a multiplicar o problema.
  5. Colunas superdimensionadas criam problemas para índices compostos. O seguinte está em um banco de dados com 8K blocos

....
SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
  2  /

Table created.

SQL> create index t23_i on t23(col1,col2)
  2  /
create index t23_i on t23(col1,col2)
                      *
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded


SQL>

Mas acima de tudo, os tamanhos das colunas são uma forma de verificação de erros. Se a coluna deve ter dez caracteres e algum processo autônomo está tentando carregar mil caracteres, algo está errado. O processo deve falhar, para que possamos investigar por que estamos carregando dados duff. A alternativa é um banco de dados cheio de lixo, e se era isso que se queria, deveríamos ter dado a todos o Excel e acabar com isso.

É verdade que alterar o tamanho da coluna quando subestimamos pode ser cansativo. Mas isso não acontece com muita frequência, e podemos mitigar muito da dor usando declarações %TYPE e SUBTYPE em nosso PL/SQL em vez de comprimentos variáveis ​​de codificação.

Os números são diferentes. Para começar, o tamanho máximo de um número é muito menor que o equivalente em texto (38 dígitos de precisão garantida).

Mas a principal diferença é que o Oracle armazena valores numéricos em notação científica portanto, não há uma relação direta entre o tamanho aritmético do número e o espaço de armazenamento que ele consome.
SQL> select vsize(123456789012345678901) n1
  2         , vsize(999999999999999999999999999999) n2
  3         , vsize(0.000000000000000000001) n3
  4         , vsize(1000000000000000000000000) n4
  5  from dual
  6  /

        N1         N2         N3         N4
---------- ---------- ---------- ----------
        12         16          2          2

SQL> 

No entanto, continua sendo uma boa prática especificar escala e precisão sempre que possível, especialmente quando estamos lidando com números inteiros, digamos, ou dinheiro.