数百万行のテーブルがあります。列 X に null 値があるかどうかをスキャンして確認し、postgresql で null 値が検出されたときに停止するには、どのクエリを使用できますか?
1 に答える
4
関係ではなく手続き的に考えています。何も「スキャン」しません。DBMS はデータを内部的にスキャンするかもしれませんが、それは最適化のためです。
必要な結果の観点から言い換えると、質問は次のようになります。「列に少なくとも 1 つの NULL があるかどうかを確認する最も効率的な方法は何ですか?」
その質問に対する私の答えは次のとおりです。
SELECT true AS null_detected FROM some_table WHERE column_x IS NULL LIMIT 1;
true
これは、列に少なくとも 1 つある場合は inを含む単一の行を返し、 sNULL
がまったくない場合は行を返しませんNULL
。これを使用することもできますが、Postgres はどちらの場合もほぼ同じ「クエリ プラン」を実行するのに十分スマートであると思います。
SELECT true AS null_detected WHERE EXISTS (SELECT 1 FROM some_table WHERE column_x IS NULL);
いずれにせよ、最大のパフォーマンス要因は、にインデックスがあるかどうかcolumn_x
です。それがなければ、Postgres はあなたが想像したようにテーブルのすべての行をスキャンする必要があります。ただし、インデックスを使用すると、インデックスを見て、多かれ少なかれ即座に答えを見つけることができるはずです。
于 2013-09-08T01:10:59.413 に答える