SQL クエリのパフォーマンスの向上: ANY
と IN
SQL クエリでは、ANY
の代わりに IN
演算子を使用するとパフォーマンスが最適化される場合があります。この記事では、変換を実行する方法と、考えられるエラーに対処する方法について説明します。
元のクエリ (IN
を使用):
<code class="language-ruby">MyModel.where(id: ids)</code>
同等のクエリ (ANY
を使用):
<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>
空の配列のエラー処理:
ids
が空の配列の場合、ANY
演算子を使用すると構文エラーが発生します。したがって、ANY
を使用する前に、配列が空でないことを必ず確認してください。
IN
と ANY
の違い:
IN
演算子には、サブクエリと値のリストの 2 つの形式があります。 ANY
演算子はサブクエリと配列式に似ています。
ただし、これら 2 つの演算子の 2 番目の形式には若干の違いがあることに注意してください。IN
は値のリストを期待するのに対し、ANY
は配列を期待します。 2 番目の形式を使用する場合、値のリストを配列に変換する必要があります。
IN
と ANY
のどちらかを選択します:
IN
と ANY
はどちらも値の比較に使用できますが、ANY
はより柔軟で、より多くの種類の演算子を処理できます。ただし、IN
は依然として有効であり、内部は =
演算子を使用して ANY
の特殊なケースとして書き換えることができます。
パフォーマンスの点では、IN
と ANY
の間に大きな違いはありません。どちらを選択するかは、値のリストと配列のどちらを提供するのが簡単かによって決まります。処理対象の ID がすでに配列として提供されている場合は、ANY
を使用する方が適切な場合があります。
Ruby で配列を渡す:
Ruby では、ANY
演算子を使用して配列を PostgreSQL クエリに渡します。
<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>
以上がパフォーマンスを向上させるには、SQL クエリで「IN」の代わりに「ANY」を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。