質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

意見交換

3回答

87閲覧

djangoのdbアクセス時間オーバヘッドを確認するコード

akiyama3284pga

総合スコア186

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2025/01/16 07:54

編集2025/01/16 08:06

djangoのdbアクセス時間オーバヘッドを大体知りたい。
このコードで測るのは妥当でしょうか?
最後の"コード実行の差"と"クエリ時間の差"との差(db_access_time_diff)の5.9秒がdbアクセス分だと思っています。(db読み取り総データ量は同じ)

最近妙にサイトが重いと感じていたのですが、自作したテンプレートタグ内で毎回modelA.objects.first().Usrのようなことをしていて、それをループしていたもので、そこでものすごく時間を要していました...

djangoは1リクエスト1接続らしいので、接続のオーバーヘッドではなくアクセスのオーバーヘッドかなと考えています。

A.Bどちらもデータベースから取得するデータ量はほぼ同じです。

from django.db import connection from django.db import reset_queries import time # reset querycount reset_queries() A_start = time.time() #------------------------ A for i in range(500): print(Schedule.objects.first().Usr) A_end = time.time() A_time_diff = A_end - A_start print('A_time_diff----------------' + str(A_time_diff)) # 6.52sec print('A_query_count----------------' + str(len(connection.queries))) # 500本 A_query_time = 0.0 for query in connection.queries: A_query_time = A_query_time + float(query['time']) print('A_query_time----------------' + str(A_query_time)) # 0.5sec # reset querycount reset_queries() B_start = time.time() #------------------------- B scs = Schedule.objects.all()[:500] for sc in scs: print(sc.Usr) B_end = time.time() B_time_diff = B_end - B_start print('B_time_diff----------------' + str(B_time_diff)) # 0.26sec print('B_query_count----------------' + str(len(connection.queries))) # 1本 B_query_time = 0.0 for query in connection.queries: B_query_time = B_query_time + float(query['time']) print('B_query_time----------------' + str(B_query_time)) # 0.01sec #---------------------------TOT time_diff = A_time_diff - B_time_diff print('time_diff----------------' + str(time_diff)) # 6.3sec query_time_diff = A_query_time - B_query_time print('query_time_diff----------------' + str(query_time_diff)) # 0.49sec db_access_time_diff = time_diff - query_time_diff print('db_access_time_diff----------------' + str(db_access_time_diff)) # 5.9sec

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答3

#1

maisumakun

総合スコア146175

投稿2025/01/16 08:07

ScheduleUsrはどのような関係性でしょうか。モデル定義もご提示いただければ幸いです。


最後の"コード実行の差"と"クエリ時間の差"との差(db_access_time_diff)の5.9秒がdbアクセス分だと思っています。(db読み取り総データ量は同じ)

「dbアクセス分」には、どのような処理を想定していますでしょうか。そもそも想定していない処理が行われている状況であれば、差分に入るものの見積もりは役に立たなくなります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

akiyama3284pga

総合スコア186

投稿2025/01/16 08:22

#1
ありがとうございます。
usrは外部キーですが、djangoの遅延アクセスを
実行させるために適当なフィールドの値を参照しているだけです。

dbアクセス分と書いていますが実際にはABの処理に差が生まれるのは何故か知りたいということです。同じデータ量を出しているのにここまで差が生まれるということはdbに毎回アクセスしている分と考えるしかないと感じております。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

akiyama3284pga

総合スコア186

投稿2025/01/16 09:42

https://qiita.com/abe_masanori/items/1a2b9c1f1069c43237f8
こちらの記事で同じことが言われていました。
やはり本質的でない部分のオーバーヘッドが悪さをするらしいです。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問