web-dev-qa-db-ja.com

db_selectがdb_queryよりもはるかに遅いとすると、なぜそれを使用したいのですか?

この背景については、 http://drupal.org/node/1067802 を参照してください。

以上のことを踏まえると、db_select()を使用したい状況、またはdb_queryのみに依存すべき状況はありますか?

69
Chris Cohen

SelectQueryを使用する理由は5つあります

  • さまざまな数の条件、結合、フィールドなどを使用して動的クエリを構築しています。例については field_read_fields() を参照してください。

  • いわゆる Extenders を使用します。エクステンダーの例は、PagerDefault( pager_query() を置き換える)とTableSort( tablesort_sql() を置き換える)です。これらにより、SelectQueryに機能を追加できます。参照 カスタムテーブルのデータを使用してページャーでソート可能なテーブルを作成するにはどうすればよいですか? 。例: node_page_default()

  • 他のモジュールがクエリを変更できるようにする必要があります。次に、いわゆる tags を追加すると、SelectQueryがそのタグに対応する変更フックを自動的に呼び出します。私はPrivatemsgモジュールでこれに大きく依存しています(カスタムクエリビルダーを使用して、D6で既にそれを実行しました)。

  • Node_accessシステムを使用して、ユーザーが表示できるノードのみを表示する必要がある場合。 $ queryに 'node_access'タグを追加するだけです。これはdb_rewrite_sql()を置き換えます。

  • SelectQueryには、サポートされているすべてのデータベースでコードを同じように機能させるためのいくつかの機能があります。たとえば SelectQuery :: orderRandom() があります。 LIKE条件がある場合、-> condition( 'field'、$ value、 'LIKE')は、常に大文字と小文字を区別しない比較であることを確認します。 D6では、はるかに遅いLOWER()を使用する必要がありました。しかし、私の知る限り、現在この2つ以上のものはありません。

これらの理由のいずれも特定のケースに該当しない場合は、db_query()を使用します。

88
Berdir

小さなパフォーマンスの向上よりも可読性、保守性、データベース間の互換性を優先するため、私は常にdb_selectを使用します。さらに、私は前述の問題で与えられた数字は全体的なパフォーマンスの誤ったイメージを与えていると思います。クエリで300マイクロ秒の違いについて話しているのは、複数の列を返すときに、数ミリ秒の範囲で実行されることが多いということです。また、1回限りのオーバーヘッド(クラスの読み込み)があり、フル(ページ)リクエストの違いがはるかに少ない場合でも、私は驚かないでしょう。

9
fietserwin

db_query() に関するドキュメントは次のように述べています。

単純なクエリ文字列の場合、この関数をSELECTクエリに使用します。呼び出し元または他のモジュールがクエリを変更する必要がある場合は、代わりにdb_select()を使用してください。

9
marcvangend