Artigo: 198625 - Última revisão: sexta-feira, 21 de Novembro de 2003 - Revisão: 3.1

INF: Optimizar comparações com numéricos, número inteiro 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 | Reduzir tudo

Sumário

Optimização de tipo de dados com tipos de dados número inteiro, decimal e numérico utilizar algumas regras muito restritas. Este artigo explica e clarifica as condições e restrições que o Optimizador utiliza para efectuar comparações de tipo de dados numérico exacto. Consulte a secção seguinte para ajudar a clarificar os termos e conceitos utilizados neste artigo.

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

Devido a limitações pelo ficheiro binário numeração utilizado pelos computadores de sistema, algumas fracções decimais simplesmente não pode ser representadas exactamente. Por exemplo, a fracção decimal 0,1 não tem uma representação binária exacta. Só podem ser aproximada. É por este motivo que flutuante ponto e real dados tipos são considerados aproximados valores; enquanto que inteiro, numérico e tipos de dados decimal são tratados como tipos de dados exacto.

Os termos " strict " ou " exacta " são referidas na respectiva definição utilizaria. Por exemplo, um numeric(10,1) vai não exactamente 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 exactamente iguais. No entanto, devido à diferença na escala, não são tratados como uma correspondência exacta computationally.

Mais Informação

Para compreender comparação opções o optimizador, deve primeiro compreender a forma de receber dados são analisados e processados.
  • Quando o SQL Server recebe um valor de 10 ou menos posições de dígito sem uma vírgula decimal, o valor é tratado como um tipo de dados número inteiro.
  • Quando o SQL Server recebe um valor de posição de dígito 11 ou mais, é tratada como um tipo de dados exacto (decimal ou numérico).
  • Quando o SQL Server recebe um valor com uma vírgula decimal, é tratada como um tipo de dados exacto.
  • Numéricos e decimais (8,0) ou valores menores que não necessitam de posições decimais podem ser representados por um valor inteiro. Sempre que é executada uma comparação estrita num decimal ou numérico (ou seja, (8,0), (7,0), (6,0), e assim sucessivamente), o valor inteiro é sempre considerado um tipo de dados mais preciso.
Tipos de dados exacto requerem comparação "strict". Ao contrário de vírgula flutuante ou tipo de dados real, arredondamento não é aceitável para manter a integridade do tipo de dados e comparações associadas.

O optimizador faz uma opção quando decidir concluir o planeamento: é o argumento receber 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 tem ser promovidos para o argumento precisão e escala. Isto requer a conversão de dados na coluna e pode resultar em planos que contêm análises de tabela.

Se o valor do argumento é menos preciso do que os dados de coluna, o argumento pode ser promovido para a precisão e escala da coluna. Normalmente, isto resulta num plano que pode utilizar um índice ou uma abordagem mais directa para o esforço de obtenção de dados.

Para ajudar a clarificar este conceito, alguns exemplos são fornecidos abaixo.

exemplo 1
create table tblTest( a numeric(8,0) PRIMARY KEY, b int)
select * from tblTest where a = 123
				
referir novamente a análise regras, a 123 é menos de 10 dígitos e não contiver uma vírgula decimal. Deste modo:
  • O argumento de entrada é considerado um valor inteiro.
  • A definição da coluna é (8,0) ou menos, por isso, o número inteiro é considerado um tipo de dados mais preciso. Assim, deve ser aplicada a conversão para a coluna de dados e menos plano ideal pode ser seleccionado.
exemplo 2
create table tblTest( a numeric(10,0) PRIMARY KEY, b int)
select * from tblTest where a = 123.
				
  • O argumento de entrada contiver uma vírgula decimal e posições não decimais são representadas na cláusula WHERE para que o argumento é apresentado como um tipo de dados exacto de decimal ou numérico (n, 0).
  • A definição da coluna é (10,0) pelo que pode ser promovido e comparado com exactamente o argumento. Normalmente, isto resulta num plano de consulta que irá utilizar uma procura de índice directa.
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 uma vírgula decimal e uma única posição decimal. Isto resulta num tipo de dados exacto (n, 1).

    NOTA: A posição decimal nesta consulta é muito importante. A consulta submetida é indicando que é matematicamente pretende comparar a uma precisão e escala de (n, 1) não (n, 0).
  • A definição da coluna é (10,0) pelo que o argumento é considerado um tipo de dados mais preciso. Assim, deve ser aplicada a conversão para a coluna de dados e menos plano ideal pode ser seleccionado.
Lembre-se a definição da tabela era de um tipo de dados exacto. Se o servidor tentou efectuar arredondamento, não vai manter as regras de um tipo de dados exacto e resultaria em processamento de resultado inválido.

Tenha em consideração o seguinte como 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 receber, (n, 2) precisão e escala, mas em vez disso, optou arredondar o argumento para a precisão da coluna e a escala, seria eleccione 123.2 quando o utilizador pretende provavelmente actualizar 123.1. Neste caso, não deverá existir nenhuma correspondência.

Todos os valores numéricos com escala inferior a 10 e precisão 0 pode ser armazenado como tinyint, smallint ou tipo de número inteiro, tomar 1, 2 e 4 bytes de armazenamento, respectivamente. Por comparação, mesmo o menor valor numérico irá demorar 5 bytes, com mais armazenamento necessário como aumenta a precisão. A tabela seguinte mostra o mapeamento entre os tipos.

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

Juntamente com os benefícios disponíveis ao utilizar mais eficientemente índices, também poderá guardar espaço considerável, utilizando um destes tipos de dados onde adequado.

SQL Server 7.0 adiciona ALTER TABLE Instruções ALTER COLUMN, que podem ser utilizadas para alterar dinamicamente o tipo de dados de uma coluna. Em versões anteriores do SQL Server, esta conversão pode ser efectuado apenas por criar uma nova tabela com as definições pretendidas e efectuar um INSERT SELECT para preencher a tabela. Tenha em atenção que esta alteração pode requerer que actualize todos os accionadores, procedimentos armazenados ou outro código que pode utilizar variáveis de espera a coluna apresente um tipo numérico.

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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )