diff --git a/lib/dml/moodle_database.php b/lib/dml/moodle_database.php index 2a6676c84e7..9c708435014 100644 --- a/lib/dml/moodle_database.php +++ b/lib/dml/moodle_database.php @@ -2108,6 +2108,15 @@ abstract class moodle_database { return ''; } + /** + * Analyze the data in temporary tables to force statistics collection after bulk data loads. + * + * @return void + */ + public function update_temp_table_stats() { + $this->temptables->update_stats(); + } + /** * Checks and returns true if transactions are supported. * diff --git a/lib/dml/moodle_temptables.php b/lib/dml/moodle_temptables.php index 19f0c20ce78..8a586fe9416 100644 --- a/lib/dml/moodle_temptables.php +++ b/lib/dml/moodle_temptables.php @@ -22,6 +22,7 @@ * * - databases not retrieving temp tables from information schema tables (mysql) * - databases using a different name schema for temp tables (like mssql). + * - databases that don't collect planner stats for temp tables (like PgSQL). * * Basically it works as a simple store of created temporary tables, providing * some simple getters/setters methods. Each database can extend it for its own @@ -31,9 +32,6 @@ * and the sql_generator, so both are able to use its facilities, with the final goal * of doing temporary tables support 100% cross-db and transparent within the DB API. * - * Only drivers needing it will use this store. Neither moodle_database (abstract) or - * databases like postgres need this, because they don't lack any temp functionality. - * * @package core_dml * @copyright 2009 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -119,6 +117,17 @@ class moodle_temptables { return null; } + /** + * Analyze the data in temporary tables to force statistics collection after bulk data loads. + * The database class detects all temporary tables and will automatically analyze all created tables + * + * @return void + */ + public function update_stats() { + // By default most databases do automatic on temporary tables, PgSQL does not. + // As a result, update_stats call immediately return for non-interesting database types. + } + /** * Dispose the temptables stuff, checking for wrong situations, informing and recovering from them */ diff --git a/lib/dml/pgsql_native_moodle_temptables.php b/lib/dml/pgsql_native_moodle_temptables.php index cd87ef2e27c..4301fe258c3 100644 --- a/lib/dml/pgsql_native_moodle_temptables.php +++ b/lib/dml/pgsql_native_moodle_temptables.php @@ -29,5 +29,16 @@ defined('MOODLE_INTERNAL') || die(); require_once(__DIR__.'/moodle_temptables.php'); class pgsql_native_moodle_temptables extends moodle_temptables { - // I love these classes :-P + /** + * Analyze the data in temporary tables to force statistics collection after bulk data loads. + * PostgreSQL does not natively support automatic temporary table stats collection, so we do it. + * + * @return void + */ + public function update_stats() { + $temptables = $this->get_temptables(); + foreach ($temptables as $temptablename) { + $this->mdb->execute("ANALYZE {".$temptablename."}"); + } + } }