web-dev-qa-db-ja.com

ビュー「execute_count_query」を最適化するにはどうすればよいですか?

そのため、mymodule_views_query_alter()を使用してビューの1つで特に厄介なクエリを最適化し、13秒から約200ミリ秒に短縮することができました。ただし、Develクエリログに、最適化を含まない、ビューが自動的に実行する " execute_count_query "が関連付けられていることがわかります。カウントクエリがフックのオーバーライドを無視するかのようです。したがって、カウントクエリは13秒の呼び出しを実行し続けます!私はそれをすべての嫌な栄光の下に貼り付けました。

では、このクエリではどのようにすればいいのでしょうか。

SELECT COUNT(*) AS expression FROM (
SELECT 1 AS expression FROM drupal_node node INNER JOIN (
SELECT td.*, tn.nid AS nid FROM drupal_taxonomy_term_data td 
INNER JOIN drupal_taxonomy_vocabulary tv ON td.vid = tv.vid 
INNER JOIN drupal_taxonomy_index tn ON tn.tid = td.tid 
WHERE (tv.machine_name IN (:db_condition_placeholder_7)) ) taxonomy_term_data_node ON node.nid = taxonomy_term_data_node.nid 
LEFT JOIN drupal_taxonomy_vocabulary taxonomy_term_data_node__taxonomy_vocabulary ON taxonomy_term_data_node.vid = taxonomy_term_data_node__taxonomy_vocabulary.vid 
LEFT JOIN drupal_field_data_field_published_at field_data_field_published_at ON node.nid = field_data_field_published_at.entity_id AND (field_data_field_published_at.entity_type = :views_join_condition_0 AND field_data_field_published_at.deleted = :views_join_condition_1) 
WHERE (( (node.status = :db_condition_placeholder_0) AND (node.nid IN (SELECT tn.nid AS nid FROM drupal_taxonomy_index tn 
LEFT OUTER JOIN drupal_taxonomy_term_hierarchy th ON th.tid = tn.tid 
LEFT OUTER JOIN drupal_taxonomy_term_hierarchy th1 ON th.parent = th1.tid 
LEFT OUTER JOIN drupal_taxonomy_term_hierarchy th2 ON th1.parent = th2.tid 
LEFT OUTER JOIN drupal_taxonomy_term_hierarchy th3 ON th2.parent = th3.tid 
LEFT OUTER JOIN drupal_taxonomy_term_hierarchy th4 ON th3.parent = th4.tid 
WHERE ( (tn.tid = :db_condition_placeholder_1) OR (th1.tid = :db_condition_placeholder_2) OR (th2.tid = :db_condition_placeholder_3) OR (th3.tid = :db_condition_placeholder_4) OR (th4.tid = :db_condition_placeholder_5) ))) )AND(( (node.type IN (:db_condition_placeholder_6)) )))) subquery
4
Adam Friedman

代わりに使用するクエリがわかっている限り、ビューのカウントクエリをかなり簡単にオーバーライドできます。たぶん他の場所にあるでしょうが、私は hook_views_pre_execute() がかなりうまくいくことを発見しました:

_function MYMODULE_views_pre_execute($view) {
  if ($view->name == 'view_name' && $view->current_display == 'page') {
    $new_count_query = db_select('some_table', 't')
      ->fields('t', array('id'))
      ->condition('some_field', 'some_condition');

    $view->build_info['count_query'] = $new_count_query;
  }
}
_

ビューは、上記のクエリをCOUNT(*)に変換します。

2
Clive

「コンテンツ:分類用語があります(深さあり)」フィルターを使用しないようにしてください-代わりに「コンテンツ:分類用語があります」を使用してください。SELECTサブクエリは使用されません。これにより、SQLクエリのパフォーマンスが劇的に向上します。

0
Eugene Fidelin