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
6 Réponses :
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 Strong> seront forts> produiront différents résultats. P>
Eh bien, ils feront des choses différentes, vous ne pouvez pas vérifier si un Ce que vous devriez faire est-ce. P> null code> est supérieur à 0 dans SQL. IF (ISNULL((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers]
WHERE VALUE = @myVal), 0) > 0 )
BEGIN
....
END
ELSE
BEGIN
....
END
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 :)
imo, chaque enregistrement / rangée dans le tableau contient NULL bitmap 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 forts> (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. p>
Cependant, le problème est que vos exemples TSQL en question et question soient ambigus avec une éventuelle interprétation et réponses multiples. P>
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 existe est assez optimisé p> Ceci est meilleur, à la fois en lisibilité et en performances: p> existe code> retourne vrai. Cela n'arrivera pas. P> IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers]
WHERE VALUE = @myVal) is null )
select (case when id is null or id=0 then (dothis) else (dothis) end) as idState from [SomeTable].[dbo].[BlockedSubscriberNumbers]
Pour quiconque le souhaite dans la requête, vous pouvez faire quelque chose comme: p>
Ici, la NULLIF retournera Ainsi, si Sélectionnez ISNULL (NULLIF (PRICEDVALUE, 0), SECONDAYVALUE) AS QUE VALEUR DE CHAQUETABLE CODE> P>
primairevalue code> comme null uniquement si elle est déjà nulle ou si elle est 0. L'ISNULL retournera secondaireValue code> si primairevalue code > est null. p>
primairevalue code> est null ou 0, puis il retournera secondairevalue code>. p>.
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 i>. 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 b> (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)"