Nplusoneは、Sqlalchemy、Peewee、Django Ormを含むPython OrmのN+1クエリ問題を検出するためのライブラリです。
多くのオブジェクトリレーショナルマッピング(ORM)ライブラリは、関係の怠zyな読み込みにデフォルトです。このパターンは、関連する行がめったにアクセスされない場合に効率的になりますが、関係がより頻繁にアクセスするにつれてすぐに非効率になります。これらの場合、関連するJOIN
を熱心に使用してロードすることは、はるかにパフォーマンスが高くなる可能性があります。残念ながら、いつ怠け者と熱心なロードを使用するかを理解することは困難な場合があります。アプリがクロールに遅くなるまで問題に気付かないかもしれません。
nplusone
は、不適切な怠zyな負荷によって引き起こされるパフォーマンスの低下を診断および改善するのに役立つORMプロファイリングツールです。 nplusone
DjangoまたはSqlalchemyを使用してアプリケーションを監視し、潜在的に高価な怠zyな負荷が放出された場合に通知を送信します。問題の背後にある問題の属性と特定のコード行を識別し、パフォーマンスを向上させるための修正を推奨できます。
nplusone
また、Flask-SqlalchemyとDjango Ormの不適切な熱心な負荷を検出し、関連データが熱心にロードされているが、現在の要求内でアクセスしないときに警告を発します。
ピップインストール-U nplusone
NplusoneはPython> = 2.7または> = 3.3をサポートします。
注: nplusone
開発にのみ使用する必要があり、生産環境に展開しないでください。
注: nplusone
django> = 1.8をサポートしています。
nplusone
INSTALLED_APPS
に追加します:
installed_apps =( ... 'nplusone.ext.django'、 ))
NPlusOneMiddleware
を追加します:
ミドルウェア=( 'nplusone.ext.django.nplusonemiddleware'、 ... ))
オプションでロギング設定を構成します。
nplusone_logger = logging.getLogger( 'nplusone') nplusone_log_level = logging.warn
ロギングハンドラーを構成します:
logging = { 「バージョン」:1、 「ハンドラー」:{ 「コンソール」:{ 「クラス」: 'logging.streamhandler'、 }、 }、 「ロガー」:{ 'nplusone':{ 「ハンドラー」:['Console']、 「レベル」:「警告」、 }、 }、 }
アプリがデータを怠lazにロードすると、 nplusone
ログメッセージを放出します。
`<model>。<field>`で検出された潜在的なn+1クエリ
この場合、select_relatedまたはprefetch_relatedの使用を検討してください。
アプリがアクセスせずに関連データを熱心にロードすると、 nplusone
警告を記録します。
`<model>。<field>`で検出された潜在的な不必要な熱量負荷
NPlusOne
でアプリケーションをラップします:
フラスコ輸入フラスコから nplusone.ext.flask_sqlalchemyからnplusoneをインポートします app = flask(__name__) nplusone(APP)
オプションでロギング設定を構成します。
app = flask(__name__) app.config ['nplusone_logger'] = logging.getLogger( 'app.nplusone') app.config ['nplusone_log_level'] = logging.error nplusone(APP)
アプリがデータを怠lazにロードすると、 nplusone
ログメッセージを放出します。
`<model>。<field>`で検出された潜在的なn+1クエリ
この場合、 subqueryload
またはjoinedload
の使用を検討してください。完全なドキュメントについては、Sqlalchemy's Guide Guide Guide Guide Guide Guide Guide for relationssion Loadingを参照してください。
アプリがアクセスせずに関連データを熱心にロードすると、 nplusone
警告を記録します。
`<model>。<field>`で検出された潜在的な不必要な熱量負荷
WSGI仕様に従う他のフレームワークについては、アプリケーションをnplusonemiddlewareでラップします。また、ORMに関連するnplusone
拡張機能をインポートする必要があります。
ボトルを輸入します nplusone.ext.wsgiからnplusonemiddlewareをインポートします nplusone.ext.sqlalchemyをインポートします app = nplusonemiddleware(bottle.app())
上記の統合は、リクエスト応答サイクルと結びついています。 HTTPリクエストのコンテキスト外でnplusone
使用するnplusone
は、 Profiler
コンテキストマネージャーを使用します。
nplusone.coreインポートプロファイラーから nplusone.ext.sqlalchemyをインポートします with profiler.profiler(): ...
デフォルトでは、 nplusone
「nplusone」という名前のロガーを使用して、すべての潜在的に不必要なクエリを記録します。 nplusone_raise構成オプションが設定されている場合、 nplusone
NPlusOneError
も上昇します。これを使用して、不要なクエリを故障させるすべての自動テストを強制することができます。
#django config nplusone_raise = true #フラスコ構成 app.config ['nplusone_raise'] = true
必要に応じて、 NPLUSONE_ERROR
オプションを使用して、例外タイプを指定することもできます。
nplusone
からの通知をグローバルに無視するには、nplusone_whitelistオプションを使用してホワイトリストを構成します。
#django config nplusone_whitelist = [ {'label': 'n_plus_one'、 'model': 'myapp.mymodel'} ] #flask-sqlalchemy config app.config ['nplusone_whitelist'] = [ {'label': 'unused_eager_load'、 'model': 'mymodel'、 'field': 'my_field'} ]
正確な名前またはfnmatchパターンでホワイトリストモデルを使用できます。
#django config nplusone_whitelist = [ {'model': 'myapp。*'} ]
ローカルで通知を抑制するには、 ignore
Context Managerを使用します。
nplusone.coreインポート信号から with signals.ignore(signals.lazy_load): #lazy-load行 #...
MITライセンス。詳細については、バンドルされたライセンスファイルを参照してください。