そのため、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
代わりに使用するクエリがわかっている限り、ビューのカウントクエリをかなり簡単にオーバーライドできます。たぶん他の場所にあるでしょうが、私は 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(*)
に変換します。
「コンテンツ:分類用語があります(深さあり)」フィルターを使用しないようにしてください-代わりに「コンテンツ:分類用語があります」を使用してください。SELECTサブクエリは使用されません。これにより、SQLクエリのパフォーマンスが劇的に向上します。