4

行うことの違いは何ですか:

SELECT * FROM table WHERE column IS NULL

また -

SELECT * FROM table WHERE column = 0

IS NULL定数と同等にするよりも大幅に悪い結果になっていますか?

ユースケースは、次のようなものがあります。

SELECT * FROM users WHERE paying IS NULL

(または列を追加する)

SELECT * FROM users WHERE is_paying = 0
4

4 に答える 4

1

私があなたの質問を正しく理解している場合、あなたは2つの状況での相対的な利点/問題について質問しています。

  • ここで、is_paying = 0
  • 支払いがnullの場合

両方がデータテーブルにあることを考えると、なぜ一方が他方よりもパフォーマンスが優れているのか考えられません。最初の方がクエリの実行内容が明確だと思うので、それが私が好むバージョンです。ただし、パフォーマンスの観点からは、同じである必要があります。

他の誰かが言及しました-そしてあなたが知っていると確信しています-NULLと0は異なる獣です。また、結合やその他の要素の最適化においても異なる動作をする可能性があります。ただし、単純なフィルタリングの場合、同じパフォーマンスが期待されます。

さて、1つの技術があります。「0」との比較はおそらくCPUに組み込まれています。NULLとの比較は、おそらくマスク、シフト、比較などを必要とするビット演算であり、これにはかなりの時間がかかる可能性があります。ただし、最初にディスクからデータを読み取っているという事実と比較すると、このパフォーマンスの違いはごくわずかです。

于 2012-07-30T02:12:08.353 に答える
0

と比較するNULLzero、2つの異なるものになります。zeroは値(既知の値)であり、NULL不明です。具体zero的には、値がzero;に設定されたことを意味します。null値が設定されていないか、nullに設定されていることを意味します。

于 2012-07-30T01:15:49.833 に答える
-1

これらのクエリを使用すると、まったく異なる結果が得られます。これは単にパフォーマンスの問題ではありません。

さまざまなユーザーがいるとします。「支払い」列にゼロ以外の値があるもの、0があるもの、値がまったくないものがあります。最後のケースは、多かれ少なかれ「null」が表すものです。

パフォーマンスに関しては、「支払い」列にインデックスがありますか?テーブルに数百行しかない場合、これはおそらく無関係です。何千もの行がある場合は、基本的に、インデックスを設定していない限り、テーブルのすべての行を反復処理するようにクエリに指示しています。これは、「paying=0」または「payingisnull」のどちらを検索しているかに関係なく当てはまります。

しかし、繰り返しになりますが、2つのクエリでは、まったく異なる結果が得られます。

于 2012-07-30T01:17:03.920 に答える
-1
于 2012-07-30T01:02:40.067 に答える