9
votes

NULLABLE VS. TYPES DE DONNÉES VARCHAR non NULLLES - qui est plus rapide pour les requêtes?

Nous préférons généralement avoir tous nos varchar code> / NVARCHAR code> Colonnes non nullables em> avec une chaîne vide ('') en tant que valeur par défaut . Quelqu'un de l'équipe a suggéré que nullable em> est meilleur parce que:

Une requête comme celle-ci: p> xxx pré>

est plus rapide que ceci: p>

Select * From MyTable Where MyColumn == ''

sql

4 commentaires

Au moins sous Oracle, une chaîne vide est également traitée comme null .


Mon expérience: pas sous MySQL.


Vos exemples ne sont pas les mêmes. Soit le premier devrait être mycolumn est null ou le second devrait être mycolumn <> '' .


Une chaîne vide n'est pas nulle , et ne devrait pas être. NULL signifie "Aucune valeur", tandis qu'une chaîne vide ... est juste une chaîne vide. MySQL (et tout SANE SQL Server) traite null différemment à partir de tout autre type de données, toute opération sur une valeur null retournera NULL (y compris null == null ).


5 Réponses :


5
votes

Si vous voulez savoir qu'il n'y a pas de valeur, utilisez NULL.

Quant à la vitesse, NULL doit être plus rapide, car il n'utilise pas la comparaison de chaînes.


0 commentaires

13
votes

sur certaines plates-formes (et même versions), cela dépend de la manière dont les nulls sont indexés.

Ma règle de base du pouce pour NULLS est la suivante:

  1. Ne laissez pas les nulls jusqu'à justification

  2. Ne laissez pas les nulls à moins que les données puissent vraiment être inconnues

    Un bon exemple de ceci est la modélisation des lignes d'adresses. Si vous avez une adresse connexion1 et Adressline2, qu'est-ce que cela signifie pour le premier à avoir des données et la seconde pour être nulle? Il me semble que vous connaissez l'adresse ou non et que vous avez des nulls partiels dans un ensemble de données, vous demandez simplement des problèmes lorsque quelqu'un les concaténe et obtient NULL (comportement ANSI). Vous pouvez résoudre ceci avec des nulls et ajouter une contrainte de contrôle - soit toutes les informations d'adresse sont NULL ou aucun n'est.

    chose similaire avec initiale moyenne / nom. Certaines personnes n'en ont pas une. Est-ce différent de celui-ci inconnu et vous souciez-vous?

    Aussi, date du décès - qu'est-ce que NULL signifie? Pas mort? Date de décès inconnu? Plusieurs fois, une seule colonne n'est pas suffisante pour coder les connaissances dans un domaine.

    Donc pour moi, s'il faut que NULLS dépendra beaucoup sur la sémantique des données de la première fois des données, cela va être seconde, car les données mal interprétées (potentiellement de nombreuses personnes différentes) sont généralement un problème beaucoup plus coûteux que la performance.

    Cela peut sembler comme une petite chose (dans SQL Server, la mise en œuvre est un bitmask stocké avec la ligne), mais permettant uniquement aux nulls après la justification de la justification de travailler mieux. Il attrape des choses tôt dans le développement, vous oblige à traiter des hypothèses et à comprendre votre domaine problématique.


2 commentaires

Quant à la date de décès: NULL signifierait qu'il n'y a pas de date connue. Dans ce cas, l'utilisation de NULL est justifiée, car vous pouviez vouloir trouver, par exemple, la date la plus ancienne enregistrée ou compter des morts (NULL n'est pas compté). La même chose s'applique à un deuxième prénom, si vous voudrez jamais savoir combien de personnes dans votre base de données ont ces.


@MEWP Vous ne pouvez pas compter les gens en chef (DtofDeath), il y a toujours des morts où vous savez qu'ils sont morts, mais vous ne connaissez pas la date de décès (ou c'est une éventuelle gamme - comme nous le savons de notre expérience de NOUVEAU Orléans après Katrina). Mon point est que vous devez penser à la manière dont vous souhaitez utiliser les données et ce que vous savez afin de modéliser le domaine problématique avec succès.



2
votes

Dites ce gars de votre équipe pour obtenir sa tête prématurément optimish de son cul! (Mais de manière agréable).

Les développeurs comme celui-ci peuvent être du poison à l'équipe, pleins de mythes d'optimisation de bas niveau, qui peuvent toutes être vraies ou ont été vrais à un moment donné pour un motif de fournisseur ou de requête spécifique, ou éventuellement vrai en théorie. mais jamais vrai dans la pratique. Agir sur ces mythes est une perte de temps coûteuse et peut détruire un design sinon bon.

Il signifie probablement bien et veut contribuer à sa connaissance à l'équipe. Malheureusement, il a tort. Pas tort dans le sens de savoir si un indice de référence prouvera sa déclaration correcte ou incorrecte. Il a tort en ce sens que ce n'est pas la façon dont vous concevez une base de données. La question de savoir s'il s'agit d'un champ Null-capable est une question sur le domaine des données aux fins de définir le type de champ. Il convient de répondre en termes de ce que cela signifie pour que le champ n'ait aucune valeur.


0 commentaires

1
votes

En un mot, null = inconnu! ou vivant. Pour les colonnes numériques, je les ai toujours par défaut à 0 (zéro) car quelque part le long de la ligne, vous devrez peut-être effectuer des calculs agrégés et NULL + 123 = null. Pour alphanumériques, j'utilise NULL depuis sa performance la moins coûteuse et plus facile à dire "... où a est nul" que de dire "... où a =" "". Utiliser '... où A = "" [Espace]' n'est pas une bonne idée parce que [L'espace] n'est pas une null! Pour les dates, si vous devez laisser une colonne de date null, vous souhaiterez peut-être ajouter une colonne d'indicateur d'état qui, dans l'exemple ci-dessus, A = Alive, D = morte, q = morte, date de décès non connu, n = vivante ou mort est inconnu.


0 commentaires

4
votes

Si vous avez besoin de NULL, utilisez NULL. Ditto String vide.

comme pour la performance, "cela dépend"

Si vous avez Varchar, vous stockez une valeur réelle dans la ligne pour la longueur. Si vous avez de l'argent, vous stockez la longueur réelle. NULL ne sera pas stocké dans la rangée en fonction du moteur (null bitmap pour SQL Server par exemple).

Ceci signifie que NULL est plus rapide, requête pour la requête, mais elle pourrait ajouter de la coalesce / nullif / isnull complexité.

Donc, votre collègue est partiellement correcte mais peut ne pas l'apprécier pleinement.

Utiliser aveuglément à la chaîne vide est l'utilisation d'une valeur sentinelle plutôt que de travaux sur le numéro Sémantic Null

fwiw et personnellement:

  • Je voudrais Tendez pour utiliser NULL mais ne pas toujours. J'aime éviter les dates comme 31 déc 9999, où l'évitement null vous mène.

  • de la réponse de cade Roux ... Je trouve aussi que les discussions sur "La date de mort nullable" inutile " Pour un champ, de manière pratique, il y a une valeur ou il n'y a pas.

  • Les valeurs sentinelles sont pires puis nulls. Nombres magiques. quiconque?


1 commentaires

31 déc 9999, dans la base de données que j'ai héritée, c'est le 1/1/1900, si ennuyeux.