Pergunta

É meu entendimento que valores nulos não são intercambiáveis ??em DB2, assumindo assim temos uma enorme mesa (Vendas) com uma coluna de data (sold_on), que é normalmente uma data, mas é ocasionalmente (10% do tempo) null.

Além disso, vamos supor que é um aplicativo de legado que não podemos mudar, para que esses valores nulos são ficar lá e significar algo (digamos que vendas que foram devolvidos).

Nós podemos fazer a seguinte consulta rápida, colocando um índice na sold_on e colunas totais

Select * from Sales 
where 
Sales.sold_on between date1 and date2
and Sales.total = 9.99

Mas um índice não vai fazer esta consulta mais rápido:

Select * from Sales 
where 
Sales.sold_on is null
and Sales.total = 9.99

Como a indexação é feito sobre o valor.

Posso nulos índice? Talvez mudando o tipo de índice? Indexar a coluna indicador?

Foi útil?

Solução

Não sou especialista DB2, mas se 10% de seus valores são nulos, eu não acho que um índice nessa coluna sozinho nunca vai ajudar a sua consulta. 10% é demais para se preocupar com um índice para - ele só vai fazer uma varredura na tabela. Se você estivesse falando de 2-3%, eu acho que seria realmente usar seu índice.

Pense em quantos registros estão em uma página / bloco - digamos 20. A razão para usar um índice é evitar buscar páginas que você não precisa. As probabilidades de que uma determinada página irão conter 0 registos que são nulo é (90%) ^ 20, ou 12%. Aqueles não são boas chances - você vai precisar de 88% das suas páginas para ser assim mesmo forçado, usando o índice não é muito útil

.

Se, no entanto, a sua cláusula select incluído apenas algumas colunas (e não *) - dizer apenas salesid, você provavelmente poderia obtê-lo a usar um índice em (sold_on, salesid), como a leitura do wouldn página de dados 't ser necessário -. todos os dados seria no índice

Outras dicas

De onde você tem a impressão de que o DB2 não nulos índice? Eu não consigo encontrar nada na documentação ou artigos de apoio à reivindicação. E apenas realizada uma consulta numa grande tabela utilizando uma IS restrição NULL envolvendo uma coluna indexada contendo uma pequena fracção de nulos; neste caso, o DB2 certamente utilizado o índice (verificado por um EXPLICAR, e observando que o banco de dados respondeu instantaneamente em vez de gastar tempo para realizar uma varredura na tabela).

Assim:. Eu afirmo que DB2 não tem nenhum problema com NULLs em índices de chaves não primárias

Mas, como outros têm escrito: Seus dados pode ser composto de uma forma em que o DB2 pensa que o uso de um índice não será mais rápido. Ou as estatísticas do banco de dados não são up-to-date para a tabela envolvida (s).

A regra de ouro é que um índice é útil para valores acima em até 15% dos registros. ... então um índice pode ser útil aqui.

Se o DB2 não irá indexar nulos, então gostaria de sugerir a adição de um campo booleano, issold, e defini-lo como true sempre que a data sold_on fica definido (isso pode ser feito em um gatilho).

Isso não é a solução mais agradável, mas pode ser o que você precisa.

Troels está correta; até mesmo linhas com um valor SOLD_ON de NULL irá beneficiar de um índice nessa coluna. Se você está fazendo pesquisas variaram em SOLD_ON, você pode se beneficiar ainda mais com a criação de um índice agrupado que começa com SOLD_ON. Neste exemplo particular, não pode exigir muito sobrecarga adicional para manter a ordem de agrupamento baseado em SOLD_ON, desde linhas mais recentes adicionadas provavelmente terá uma data SOLD_ON mais recente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top