COALESCEとISNULLのパフォーマンスの違いは?


48

多くの人がISNULLの代わりにCOALESCE関数を使用するのを見てきました。インターネット検索から、COALESCEはANSI標準であることがわかったので、COALESCEを使用するときに何を期待するかを知っているという利点があります。ただし、ISNULLの方がわかりやすいため、ISNULLの方が読みやすいようです。

ISNULLは、データベースサーバーや言語によって動作が異なるため、ややこしいこともわかります。

私の考えでは、そのすべてがスタイルと標準に要約されています。スタイルが主観的であることを考えると、ISNULLではなくCOALESCEを使用する(またはその逆)理由はありますか?具体的には、一方のパフォーマンスが他方より優れていますか?


1
のサブクエリがCOALESCE 2回評価さ
マーティンスミス

4
「ISNULLは、何をしているのかがより明確に見えるため、読みやすいようです」-本当に?直感に反する名前を見つけました。式がnullまたは不明に解決されたかどうかを示すブール値を返すと予想されます。名前COALESCEは単に直感的ではありません;)
いつか

回答:



40
  • ISNULLはSybase / SQL Server固有です
  • COALESCEはポータブルです

それから

  • ISNULLは2つの引数を取ります
  • COALESCEは1-n引数を取ります

最後に、楽しいビット。結果のデータ型と長さ/精度/スケール

この最後のビットは、ISNULLが通常使用される理由です。なぜなら、より予測可能(?)であり、COALESCEが意図しないデータ型変換を追加できるためです。

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

すべてのデータ型が同じであるため、実際的な違いはありません...


22

マークが指摘したように、パフォーマンスの違いを見つけるのに苦労します。他の要因がより重要になると思います。私にとっては、私は常に COALESCE 使用していますが、そのほとんどはすでにあなたまたはマークによって言及されています。

  • COALESCEはANSI標準です。コードを移植する場合、心配する必要はありません。個人的には、これはそれほど重要ではありません。Celkoの教室の外で実際にそのようなポートが実際に発生する頻度は低いのですが、一部の人にとってはこれが利点です。
  • 読みやすさについて述べたこととは反対に、特にISNULLがブール値(SQL Serverには存在しない)を返す他の言語またはプラットフォームから来ているユーザーにとっては、ISNULLを読むのが難しくなることがあります。確かに、COALESCEはつづりにくいですが、少なくとも誤った仮定につながることはありません。
  • COALESCE(a、b、c、d)と言えるように、COALESCEははるかに柔軟性がありますが、ISNULLでは同じことを達成するために多くのネストを行う必要があります。

また、2つの関数を異なるデータ型/精度などで使用している場合、2つの関数を使用してデータ型の優先順位がどのように処理されるかを知っている必要があります。

注意

例外が1つあります。これらは、SQL Serverの現在のバージョンで異なる方法で処理されます。

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCEバリアントは、実際に実行されますsome_aggregate_query(値をチェックするために一度、および非ゼロ時に一度はそれを返すために)二回、間、ISNULL一度だけサブクエリを実行します。ここで、他のいくつかの違いについて説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.