2009-07-05 12 views
7

私はこれまで、PythonフレームワークDjangoに基づいていくつかのプロジェクトを開発しました。そしてそれは私の生産を大きく改善しました。しかし、プロジェクトがリリースされ、来場者が増えたとき、dbはパフォーマンスのボトルネックになります。ORMの意味は?

私はこの問題に取り組み、ORM(django)が非常に遅くなることを発見しました。どうして? Djangoはあなたが使用しているdbバックエンドに関係なく、プログラマのための統一インタフェースを提供する必要があるからです。だから、間違いなくいくつかのdbのパフォーマンスを犠牲にします(1つのraw SQLを複数のsqlsにして、db固有の操作を使用しないでください)。

  1. オファーprogarammersのための均一なOOインターフェース
  2. (SQL Serverまたは他の人にMySQLからの)デシベルバックエンドの移行がはるかに簡単に作る:私はORMを思ったんだけど

    は間違いなく有用であり、それができます

(ORMを使用すると、以下のコードを意味し、以下のコードは以下のエラーを意味する)のコードの堅牢性を向上しかし、私は、移行の要件を持っていない場合、の意味は何ですか私にORM?

ps。最近、私の友人は、彼が今やっていることは、より良いパフォーマンスを得るためにORMコードをraw SQLに書き直すことだと言いました。お気の毒に!

ORMの本当の意味は何ですか? (間違いがあれば修正してください)

+5

「意味」よりも「価値」を意味すると思いますか? –

+0

あなたは正しいです。ありがとう。 –

答えて

7

ORMのメリットを列挙したときに、主にあなた自身の質問に答えました。遭遇する最適化の問題は間違いありませんが、データベース・インタフェースの抽象化はおそらくこれらの欠点をはるかに乗り越えます。

ORMは、1つしか使用できない多くのSQL文を使用することがあります。 ORMでサポートされている場合は、「eager loading」を参照してください。これは、関連するモデルから別のモデルのデータをフェッチすると同時にORMにデータをフェッチするように指示します。これにより、よりパフォーマンスの高いSQLが生成されます。

ORMを使用して必要な部分を最適化することをお勧めしますが、アクセスを実行する前にSQLを書き込む前にパフォーマンスを向上させるORM内のメソッドを調べてください。ここで

+0

私はあなたにほとんど同意します。実際には、どのORM操作がdbクエリを遅くし、ORM内部をハッキングした後に最適化するかを知ることができます。これは、私が片方のSQLをよく知っていて、別の側でORMの内部をよく知っていることを意味します。それは、生のSQLに焦点を合わせることと比較して価値がないようです。 –

3

良いORMを使用すると、特定のクエリがボトルネックであることがわかった場合にデータアクセスを調整できます。

しかし、これを行う必要があるかもしれないという事実は、ボトルネックがどこにあるのかをすぐに知ることができるので、ORMアプローチの価値を決して排除しません。すべてのコード行が同じ量の慎重な手の最適化を必要とすることはめったにありません。そのほとんどはそうしないでしょう。ほんの少しのホットスポットで注意が必要です。

すべてのSQLを手作業で記述すると、必要のない部分も含め、製品全体に「マイクロ最適化」されます。だからあなたは大部分が努力を浪費しています。

+0

データベースにアクセスする複数の異なるクライアントチームのデータを管理する開発者DBAをお持ちの場合はどうなりますか? – gbn

+0

@gbn - あなたはその質問にどこに行くのかはっきりしていませんが、その場合、私はORMで開発された単一のデータレイヤーを他のすべてのチームに公開して共有し、フィードバック(パフォーマンス、ユーザビリティ、その他の品質基準にかかわらず)。 –

+0

私の指示は:すべてのクライアントチームが私のストアドプロシージャに対してコード化しています。これにより、Java、C#、vb.net、VBAクライアントに対処できます。 DALはストアドプロシージャです。クライアント言語とORMは無関係です。 – gbn

1

Wikipedia

オブジェクトリレーショナルマッピングから定義されたリレーショナルデータベースとオブジェクト指向プログラミング言語で互換性のない型システム間でデータを変換するためのプログラミング技術です。実際には、プログラミング言語内から使用できる「仮想オブジェクトデータベース」が作成されます。

0

良いORM(Djangoのような)は、あなたのアプリケーションを開発し、進化させるのがずっと速くなります。手作業でチューニングされたすべてのクエリを使用することなく、関連するすべてのデータを利用できると想定することができます。

しかし、シンプルなもの(Djangoのようなもの)は、古いDBデザインからあなたを解放するものではありません。 DBのボトルネックが数百人にも及ぶ場合は同時ユーザーユーザーには深刻な問題があります。 DBがうまくチューニングされていない(通常はインデックスが欠落している)、またはデータ設計を適切に表していない(これが問題であるすべてのページに対して多くの異なるクエリが必要な場合)。

あなたがTwitterやFlickrでない限り、私はORMを捨てません。まず、すべての通常のDB分析を実行します。フル・テーブル・スキャンが多数表示されますか?適切なインデックスを追加します。ページあたりのたくさんのクエリ?あなたのテーブルを再考してください。すべてのユーザーは多くの統計を必要としますか?バッチジョブでそれらをあらかじめ計算し、そこから提供してください。

+0

ありがとうございます。しかし、DBをチューニングした後、同じ問題に直面する可能性があります。たぶんdbをチューニングすることはできません。より良いパフォーマンスを得るには、ORM操作をraw SQLに書き直すことを検討する必要があります。もちろん –

+0

。私はちょうど、ORMのパフォーマンスの上限が本当に高いと信じています。ほとんどのサイトは近くにはありません。また、単にDBをチューニングするだけではありません。適切なデータ構造とアルゴリズムを使用することも重要です。ページごとに50のクエリを実行する場合、DBチューニングの量は役に立ちません。理想的には10未満、5未満に減らす必要があります。 – Javier

0

ORMを使用すると、厄介なSQLを書く必要がなくなります。

これは、ソフトウェアを別のデータベースエンジンに移植した場合にも役立ちます。

パフォーマンス面では、SQLのカスタムフレーバーを書いて修正していますが、最初に書き込む必要がないようにしました。

+0

ありがとうございます。しかし、あなたは私の投稿を読まなかったと思います。 –

+0

いいえ、私はそれを読んでいます。 ORMには2つの理由があります。 –

0

ORMはあなたのためにSQLクエリを生成し、オブジェクトとして返します。そのため、データベースに直接アクセスするよりも時間がかかります。しかし、私はそれが少し遅くなると思います...私はあなたのデータベースを調整することをお勧めします。あなたがテーブルなどのインデックスについて確認する必要があるかもしれません。

Oracleは、たとえば、私はなぜ、わかりませんが、私のdbの管理者がそれを行ったと高速クエリを使用する必要がある場合調整する必要がありますたくさんのデータに関わるもの)。

(更新削除/ CRUDの作成以外の)複雑なクエリ(レポートなど)が必要な場合や、アプリケーションで別のデータベースを使用しない場合は、直接SQLを使用することをお勧めします(Djangoにはそれは機能)

+0

ありがとうございます。あなたの結論は私のものとほぼ同じです。 –