2010-03-10 3 views
3

J'ai une table et la seule fois où je vais sélectionner ou faire quoi que ce soit contre cela est de trouver toutes les lignes où une certaine colonne de date est nulle. À partir de là, je fais des choses avec et mettre à jour cette colonne, et probablement je ne reviendrai plus jamais sur cette ligne, à l'exception des fins d'audit.Comment indexer une table pour optimiser pour trouver null?

Alors, est-il une bonne pratique pour s'assurer que les lignes où ma colonne SentDate est nulle sont plus rapidement trouvées?

+0

Le partitionnement serait-il trop lourd? (http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx) –

+0

Dans ce cas particulier, oui. Mais bonne pensée! –

Répondre

2

Pour optimiser une table pour trouver des valeurs nulles, vous utilisez des index, bien sûr. NULLs sont indexés et sont en mesure cherchent-comme toute autre valeur:

create table foo (a int null, b varchar(100) null); 
create clustered index cdxFoo on foo(a); 
go 

insert into foo (a,b) select Number, 'not null' from master..spt_values 

insert into foo (a,b) values (null, 'null') 

select * from foo where a is null 

Le plan de requête pour la sélection montre clairement que cherche sur « NULL » clé est utilisée pour localiser la ligne.

+0

D'accord, complètement sans rapport avec ma question d'origine ... qu'est-ce que c'est que le maître ... spt_values? En fait, j'ai regardé ça, mais je ne suis pas sûr d'avoir bien compris. Et vous pouvez utiliser dbname..tablename pour ignorer la partie propriétaire? Où diable ai-je été? –

+0

master..spt_values ​​est un tableau de nombres, utilisé principalement par ... forum answerers. La syntaxe database..object est valide, est un 'schéma implicite à trois parties', le nom du schéma manquant sera défini par défaut sur votre schéma par défaut (généralement dbo). Je pourrais facilement argumenter que l'utilisation de spt_values ​​et le recours au schéma par défaut sont de mauvaises pratiques ... –

+0

J'ai augmenté cette valeur et demandé que mon original soit supprimé. Répondait depuis le camp Oracle et n'était pas au courant de l'indexation des NULL par SQL Server (et plusieurs autres DB). Il semble qu'Oracle et Postgres sont dans la minorité de son traitement de NULL, puisque DB2, Sybase et MySQL vont également indexer/appliquer une contrainte unqiue à des valeurs nulles. – codenheim

1

Vous pouvez définir le Default Value or Binding du champ sur quelque chose qui ne sera jamais utilisé, puis rechercher cette valeur. Sinon, vous effectuerez une analyse de table.

0

Dans SQL Server 2008, vous pouvez filtrer un index, de sorte que vous puissiez théoriquement créer votre index pour inclure uniquement les valeurs NULL, c'est-à-dire WHERE SentDate IS NULL.

Questions connexes