ID do artigo: 198625 - Última revisão: sexta-feira, 21 de novembro de 2003 - Revisão: 3.1

INF: Otimizando comparações com números, Integer e outros

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Otimização de tipo de dados com tipos de dados inteiro, decimal e numérico usar algumas regras muito rigorosas. Este artigo explica e esclarece as condições e restrições que o otimizador usa para executar comparações de tipo de dados numérico exato. Revise a seção seguinte para ajudar a esclarecer os termos e conceitos usados neste artigo.

" precisão " é o número de dígitos em um número. " escala " é o número de dígitos à direita da vírgula decimal em um número. Por exemplo, o número 123.45 tem uma precisão de 5 e uma escala de 2.

Devido às limitações com o binário numeração sistema utilizado pelos computadores, alguns frações decimais simplesmente não pode ser representadas exatamente. Por exemplo, a fração decimal 0,1 não tem uma representação binária exata. Ele só pode ser aproximado. É por esse motivo que valores de dados flutuantes de ponto e real tipos são considerados aproximados; enquanto inteiro, numérico, e tipos de dados decimal são tratados como tipos de dados exato.

Os termos " restrita " ou " exata " são chamados em sua definição computacional. Por exemplo, um numeric(10,1) não exatamente ou estritamente comparará com um numeric(10,2) mesmo se os números envolvidos forem matematicamente equivalentes. Matematicamente, um valor de 10.1 e 10.10 são exatamente os mesmos. No entanto, devido à diferença em escala, eles não são tratados como uma correspondência exata computacionalmente.

Mais Informações

Para entender as opções de comparação do otimizador, você deve primeiro compreender a forma de entrada dados são analisados e manipulados.
  • Quando o SQL Server recebe um valor de 10 ou menos posições de dígito sem um ponto decimal, o valor é tratado como um tipo de dados inteiro.
  • Quando o SQL Server recebe um valor de 11 ou mais posições de dígito, ele será tratado como um tipo de dados exato (decimal ou numérico).
  • Quando o SQL Server recebe um valor com uma vírgula decimal, ele será tratado como um tipo de dados exato.
  • (8,0) Decimais e numéricos ou valores menores que não requerem posições decimais podem ser representados por um valor inteiro. Sempre que é executada uma comparação estrita em um numérico ou decimal (ou seja, (8,0), (7,0), (6,0), e assim por diante), o valor inteiro será sempre considerado um tipo de dados mais preciso.
Tipos de dados exato requerem comparação "restrita". Ao contrário de um tipo de dados real ou float, arredondamento não é aceitável para manter a integridade do tipo de dados e comparações associadas.

O otimizador faz uma opção quando ela decide para concluir o plano: é o argumento de entrada mais ou menos preciso do que a definição da tabela?

Se o valor do argumento é mais preciso do que os dados de coluna, os dados da coluna devem ser promovidos para o argumento precisão e escala. Isso requer a conversão de dados na coluna e pode resultar em planos que contêm verificações de tabela.

Se o valor de argumento é menos preciso do que os dados de coluna, o argumento pode ser promovido a precisão e escala da coluna. Isso geralmente resulta em um plano que pode utilizar um índice ou uma abordagem mais direta para o esforço de recuperação de dados.

Para ajudar a esclarecer esse conceito, alguns exemplos são fornecidos a seguir.

exemplo 1
create table tblTest( a numeric(8,0) PRIMARY KEY, b int)
select * from tblTest where a = 123
				
voltando para a análise regras, o 123 é menos de 10 dígitos e ele não contém um ponto decimal. Portanto:
  • O argumento de entrada é considerado um valor inteiro.
  • A definição da coluna é (8,0) ou menos, portanto, o número inteiro é considerado um tipo de dados mais preciso. Portanto, a conversão deve ser aplicada à coluna de dados e menor que o plano otimizado de pode ser selecionado.
exemplo 2
create table tblTest( a numeric(10,0) PRIMARY KEY, b int)
select * from tblTest where a = 123.
				
  • O argumento de entrada contém um ponto decimal e não posições decimais são representadas na cláusula WHERE para que o argumento é visto como um tipo de dados exato de decimal ou numérico (n, 0).
  • A definição de coluna é (10,0) para que o argumento pode ser promovido e comparado exatamente. Isso geralmente resulta em um plano de consulta que irá usar uma pesquisa de índice direto.
exemplo 3
create table tblTest( a numeric(10,0) PRIMARY KEY, b int)
select * from tblTest where a = 123.0
				
  • O argumento de entrada contém um ponto decimal e uma única posição decimal. Isso resulta em um tipo de dados exato (n, 1).

    Observação: A posição decimal nessa consulta é muito importante. A consulta enviada é informando que ele matematicamente deseja comparar em uma precisão e escala de (n, 1) não (n, 0).
  • A definição de coluna é (10,0) para que o argumento seja considerado um tipo de dados mais preciso. Portanto, a conversão deve ser aplicada à coluna de dados e menor que o plano otimizado de pode ser selecionado.
Lembre-se de que a definição da tabela era um tipo de dados exato. Se o servidor tentou fazer o arredondamento, ele não poderia manter as regras de um tipo de dados exato e resultaria no processamento de resultado inválido.

Considere o seguinte exemplo:
create table tblTest( a numeric(10,1) PRIMARY KEY, b int)
select * from tblTest where a = 123.15
				
se o SQL Server não escolhido um plano para converter os dados de coluna do argumento da entrada, (n, 2) precisão e escala, mas em vez disso, decidiu arredondar o argumento para o precisão da coluna e a escala, ele seria eleger 123.2 quando o usuário provavelmente quisesse atualizar 123.1. Nesse caso, não deve haver nenhuma correspondência.

Todos os valores numéricos com escala menor do que 10 e precisão 0 pode ser armazenada como tinyint, smallint ou tipo inteiro, levando 1, 2 e 4 bytes de armazenamento, respectivamente. Por comparação, até mesmo o menor valor numérico levará 5 bytes, com mais armazenamento necessário como aumenta a precisão. A tabela a seguir mostra o mapeamento entre os tipos.

Recolher esta tabelaExpandir esta tabela
PrecisãoNovo tipo
<= 2tinyint
<= 4smallint
<10Int

Em adição aos benefícios disponíveis por meio de índices com mais eficiência, você também pode salvar um espaço considerável usando um desses tipos de dados onde for apropriado.

SQL Server 7.0 adiciona ALTER TABLE Instruções ALTER COLUMN, que podem ser usadas para alterar dinamicamente o tipo de dados de uma coluna. Em versões anteriores do SQL Server, essa conversão pode ser feita somente por criar uma nova tabela com as definições desejadas e fazer um INSERT SELECT para preencher a tabela. Observe que essa alteração pode exigir a atualizar os disparadores, procedimentos armazenados ou outro código que pode usar variáveis esperando um tipo numérico para a coluna.

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbbug kbinfo KB198625 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 198625  (http://support.microsoft.com/kb/198625/en-us/ )