web-dev-qa-db-ja.com

SQLステートメントを生成しているビュー/ページ/モジュールを見つける方法

Pantheonホスティングアカウントでnewrelicパフォーマンスモニタリングを行っています。 「遅いSQL」レポートが表示されますが、どのページ、ビュー、またはモジュールがSQLステートメントを生成しているかはわかりません。

例えば:

SELECT node.nid AS nid、node.title AS node_title、users_node.name AS users_node_name、users_node.uid AS users_node_uid、node.created AS node_created、 '?' AS field_data_field_photo_node_entity_type FROMノードノードINNER JOIN users users_node ON node.uid = users_node.uid LEFT JOIN field_data_field_photo_topic field_data_field_photo_topic ON node.nid = field_data_field_photo_topic.entity_id AND field_data_field_photo_topic.id_field_photo_topic_photo_topic_photo_topic_photo WHERE((((node.status =:db_condition_placeholder_?)AND(users_node.uid =:users_uid?))AND(((node.type IN(:db_condition_placeholder_?))AND(field_data_field_photo_topic.field_photo_topic_tid IS NULL ))))ORDER BY node_created DESC LIMIT?オフセット?

どうすればその情報を入手できますか?

3
uwe

(あなたの場合のように)クエリがViewsモジュールから実行される場合、そのクエリを実行するビューを探すことができます。

Admin/structure/views/settingsに移動し、「SQLクエリを表示」を選択します。それでも問題が解決しない場合は、[ライブプレビュー中にレンダリング中に実行された他のクエリを表示する]オプションもあります。

screenshot

たとえば、これはトラッカービューで取得した出力です。

screenshot

Admin/structure/views/settings/advancedには、次の説明がある「すべてのSQLクエリにビューのシグネチャを追加する」もあります。

ビューが生成するすべてのクエリには、ビューの名前が含まれ、SELECT句の最後に文字列として「view-name:display-name」が表示されます。これにより、データベースサーバーログでのビュークエリの識別が簡単になりますが、トラブルシューティングの場合にのみ使用してください。

screenshot

前の例では、クエリは次のようになります。 ('tracker:default' AS view_name一部。)

SELECT node.type AS node_type, node.title AS node_title, node.nid AS nid, node.language AS node_language, users_node.name AS users_node_name, users_node.uid AS users_node_uid, node_comment_statistics.comment_count AS node_comment_statistics_comment_count, node_comment_statistics.last_comment_timestamp AS node_comment_statistics_last_comment_timestamp, history.timestamp AS history_timestamp, node.created AS node_created, node.changed AS node_changed, 'tracker:default' AS view_name
FROM 
{node} node
LEFT JOIN {users} users_node ON node.uid = users_node.uid
INNER JOIN {node_comment_statistics} node_comment_statistics ON node.nid = node_comment_statistics.nid
LEFT JOIN {history} history ON node.nid = history.nid AND history.uid = '1'
WHERE (( (node.status = '1') ))
ORDER BY node_comment_statistics_last_comment_timestamp DESC
LIMIT 25 OFFSET 0
3
kiamlaluno

あなたのログは MySQL Slow Query Log からの出力であると思います。ここで最終的に何が起こるかはサーバーの構成によって異なりますが、一般的な原因は次のとおりです。

  1. 時間がかかるクエリ
  2. インデックスを使用しないクエリ

私の提案は、タイムスタンプ(開始時間)をApacheのaccess_logに一致させてページを取得することです。次に、 Devel モジュールを使用して、admin/config/development/develから「クエリログの表示」を有効にします。これにより、クエリが記録され、実行時間とともにログに記録されます。

screenshot

その悪いクエリはビューに関連付けられているようです。これらについては、[詳細設定]ページで[すべてのSQLクエリにビューの署名を追加]を有効にします。これを行うと、どのビューが遅いかを特定できます。

「遅さ」を解決するには、クエリをコピーして手動で編集し、パラメータを追加します。次に、MySQLツールを開き、 EXPLAIN ステートメントを使用します。それがあなたに伝えていることを見て、そこから進んでください。

4
mpdonadio