9
votes

Vérifier sur null ou 0

Qu'est-ce qui est plus rapide dans SQL pour vérifier la valeur pour NULL ou 0

Je veux avoir le moyen le plus rapide de vérifier est la valeur déjà dans le tableau. p>

par exemple qui est plus rapide: P>

IF ((SELECT COUNT(ID) FROM [SomeTable].[dbo].[BlockedSubscriberNumbers]
     WHERE VALUE = @myVal) > 0 )
BEGIN
....
END
ELSE
BEGIN
....
END


7 commentaires

Ce sont deux requêtes différentes qui rendront des résultats différents.


Cela pourrait être bon de savoir, mais rappelez-vous que L'optimisation prématurée est la racine de tout mal . Les deux moyens pourraient fonctionner, en fonction de vos besoins. Choisir un. L'une ou l'autre méthode ne sera certainement pas votre problème de performance (si vous en avez un pour commencer).


Êtes-vous garanti que votre sélection retourne toujours 0 ou 1 résultats? Vous obtiendrez une erreur si la requête retourne plus d'une ligne.


@Joe ID est la clé principale, donc il ne peut donc pas y avoir de valeurs multiples.


@Incognito: Si vous me disiez que la valeur était la clé principale, je vais bien. Je vois toujours le potentiel que la valeur = @ myval pourrait être vraie pour plus d'un identifiant.


@Joe Désolé, j'oublie de mentionner que la valeur est unique.


Cela semble un extrait d'une procréation de la procédure ... T-SQL est optimisé pour les déclarations définies. Mais si vous voulez tester quelque chose comme ça gardez à l'esprit que votre où pourrait entraîner un ou plusieurs enregistrements. Les derniers accidents avec une erreur. Le milieu peut échouer si l'identifiant est 0. Après avoir lu le fil entier, je préfère le "si il existe (SELECT * de blockedsubscribernumbers où valeur = @myval)"


6 Réponses :


2
votes

Vérification de NULL est beaucoup plus rapide que la vérification de 0, mais je pense que, pour ces questions, nous parlons de choses différentes: ils seront produiront différents résultats.


0 commentaires

3
votes

Eh bien, ils feront des choses différentes, vous ne pouvez pas vérifier si un null code> est supérieur à 0 dans SQL.

Ce que vous devriez faire est-ce. P>

    IF (ISNULL((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
         WHERE VALUE = @myVal), 0) > 0 )
    BEGIN
    ....
    END
    ELSE
    BEGIN
    ....
    END


6 commentaires

Regardez plus attentivement les parens de la requête d'origine. L'OP n'essaie pas de tester @myval> 0, il tente de tester le résultat de la requête, ID.


@Joe Stefanelli, bonne fixation de capture


En fait, je ne me soucie pas de la comparaison, c'est une râpe nulle que 0. Si le résultat de la requête sera nul et qu'il sera comparé à 0, il ira au bloc, ce qui signifie qu'il n'ya aucune valeur dans le tableau égal à @myval. Donc, pour résumer, je dois juste vérifier est la valeur déjà ou non.


Vous essayez donc d'obtenir le nombre de lignes retournées par la requête alors?


@msarchet en général, je dois vérifier y a-t-il un enregistrement ou non. Pas important combien de lignes sont là. Quoi qu'il en soit, cela peut être sur ou aucun comme champ de valeur n'est unique.


@msarchet j'ai mentionné en question "Je veux avoir le moyen le plus rapide de vérifier est une valeur déjà dans le tableau". Mais on dirait que je l'ai écrit à tort :)



1
votes

imo, chaque enregistrement / rangée dans le tableau contient NULL bitmap (2 octets, dont chaque bit raconte de nuls d'une / chacune de la valeur de la colonne de cette rangée) , donc avant de sélectionner / Lecture de la valeur stockée réelle Ce processus de lecture de données passe cette vérification / lecture du bit correspondant à partir de cette carte de bit NULL.

Dans le cas de NULL (ou, en d'autres termes, "N'EST PAS NULL" CHECK), le processus de lecture s'arrête à ce stade, tandis que d'autres sélectionnements / chèques / comparaison peuvent (ou non, Cela dépend) Continuer, alors "est une vérification nulle" ne peut pas être plus lente. Encore plus, les valeurs nulles à la fin de la rangée ne sont même pas stockées, aucun stockage n'est occupé par eux. Ils sont pratiquement et, parfois, pratiquement rien.

Cependant, le problème est que vos exemples TSQL en question et question soient ambigus avec une éventuelle interprétation et réponses multiples.


0 commentaires

0
votes

existe peut être plus rapide que le nombre, surtout si les rangées que vous recherchez sont très grandes et que vous ne devriez pas trop m'attarder sur des micro-optimisations. S'efforcer d'abord la lisibilité du code, de sorte que d'autres lire votre code puissent facilement glaner l'intention de votre requête. Quoi qu'il en soit, le nombre tentera toujours de boucler les lignes, même s'il trouve déjà la valeur que vous recherchez. Existe est une directive pour votre SGBBR d'arrêter de rechercher dès qu'il correspond à vos critères.

et d'ailleurs, la logique de votre code est si quelque chose est strong> em>, c'est pourquoi Il y a une construction de langue de première classe introduite dans la langue pour faciliter cela. Et bien sûr, les ingénieurs du vendeur de la base de données mettront des efforts pour optimiser cela, étant donné qu'il s'agit essentiellement d'un problème résolu. Vous ne vous attendez pas à ne pas réutiliser leur moteur code> moteur code> pour des fonctionnalités existantes, ce serait plutôt mauvais s'il existe attendu au compte et à son résultat, puis vérifiez si ce résultat est supérieur à zéro pour faire existe code> retourne vrai. Cela n'arrivera pas. P>

existe est assez optimisé p>

Ceci est meilleur, à la fois en lisibilité et en performances: p>

IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) is null )


0 commentaires

-1
votes
select (case when id is null or id=0
then (dothis) else (dothis) end) as idState 
from [SomeTable].[dbo].[BlockedSubscriberNumbers]

0 commentaires

1
votes

Pour quiconque le souhaite dans la requête, vous pouvez faire quelque chose comme:

Sélectionnez ISNULL (NULLIF (PRICEDVALUE, 0), SECONDAYVALUE) AS QUE VALEUR DE CHAQUETABLE

Ici, la NULLIF retournera primairevalue comme null uniquement si elle est déjà nulle ou si elle est 0. L'ISNULL retournera secondaireValue si primairevalue est null.

Ainsi, si primairevalue est null ou 0, puis il retournera secondairevalue . .


0 commentaires