*Pythonと*Djangoに関するyamadarのブックマーク (5)
-
select_relatedとprefetch_relatedでクエリの最適化 models.pyにてOneToOneFieldやForeignKey、ManyToManyField︵外部キー︶を多用しすぎると次第にデータベースへの接続数が多くなりページの読み込みスピードに影響を与えるようになってきます。 例えば、objects.get()などで特定のデータを取得した後に、フィールドで指定してあるForeignKeyを指定するとDjangoはもう一度データベースに接続してデータを取得しようとします。合計で2回クエリが発生するようになります。 もしくはobjects.filter()で取得したデータをfor文でループして、フィールドを指定したとしましょう。データが10個あれば、初めの1回+10回で合計11回のクエリが発生することになります。 開発を行なっているときは、sqlite3を用いるケ
-
この記事はDjango prefetch_related()を使ってDBアクセスを高速化する方法 前編の続きです。前編ではprefetch_related()の基本的な使い方を解説しました。 後編では、prefetch_related()とPrefetchオブジェクトを組み合わせて使う方法を解説します。 サンプルコードのRestaurantクラスやPizzaクラスなどは前回の記事を参照してください。 PrefetchオブジェクトPrefetchオブジェクトを使うと、prefetch_related()による事前呼び出しをより細かく操作できます。 Prefetchの一番シンプルな使い方は、文字列ベースのルックアップです。Prefetchオブジェクトを使わなくても同等に書けます。 from django.db.models import Prefetch Restaurant.objects.
-
DBに何度もアクセスしてデータを取り出す事は非効率になるため、可能な限り、少ないクエリでデータを取得する必要があります。Djangoではselect_related()やprefetch_related()を使う事でクエリを最適化できます。 今回はprefetch_related()を使って高速化する方法を前編・後編に分けて解説します。 前編はprefetch_related()の基本的な使い方を、後編はPrefetchオブジェクトと組み合わせて使う方法を解説します。 公式ドキュメントのprefetch_related()の解説の中から、主に高速化に関する部分を解説しています。 prefetch_related(*lookups)prefetch_related()を使うと、指定したlookupsそれぞれに対して関連するオブジェクトを自動的に取得したQuerySetを返します。 selec
-
Djangoを使っていて、イケてないSQLがありました。 そもそも、僕はDjangoのprefetch_relatedとselect_relatedがよくわかっていませんでした。 今回は、それを調べたので説明を書きます。 prefetch_relatedとselect_relatedって? 準備 モデルを用意する。 データを用意する SQLをログに出力する。 試行 select_related prefetch_related select_relatedとprefetch_related Prefetchオブジェクト 終わり prefetch_relatedとselect_relatedって? 両方ともDjagnoのForeignKeyに関係するORMのメソッド。 とりあえず使ってみます。 ちなみにDjangoのバージョンは 1.11 です。 Pythonのバージョンは 3.6 です。
-
Google、ORMが生成するSQLが遅いときの調査を容易にする﹁sqlcommenter﹂をオープンソースで公開。Rails、Spring、Djangoなど主要なフレームワークに対応 SQL文を直接書かなくとも、自動的にSQL文を生成、実行してくれるORM︵Object-Relational Mapper︶は、プログラミングを容易にしてくれる技術としてRailsやHibernate、Springなどさまざまなフレームワークなどで活用されています。 一方で、ORMが生成するSQL文はときに複雑に、あるいは非効率なものとなり、データベース処理の遅さにつながることもあります。 このとき、SQL文の生成と実行を明示的にコードとして記述する必要がないというORMの特徴が、なぜデータベース処理が遅くなったのか、どのようなSQL文が生成され、そのどこに原因があるのか、といった調査を難しくている面があり
-
1