From f51d95b9ac866e33977c3c15925cb0a8898aea2d Mon Sep 17 00:00:00 2001 From: Mario de Frutos Dieguez Date: Thu, 31 Jan 2019 17:58:03 +0100 Subject: [PATCH] Patch for load times with pg_type loading in AR - See https://github.com/CartoDB/cartodb/issues/14615 - See https://github.com/rails/rails/issues/19578 --- .../zz_patch_activerecord_type_loading.rb | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 config/initializers/zz_patch_activerecord_type_loading.rb diff --git a/config/initializers/zz_patch_activerecord_type_loading.rb b/config/initializers/zz_patch_activerecord_type_loading.rb new file mode 100644 index 000000000000..2c685ac2ec3a --- /dev/null +++ b/config/initializers/zz_patch_activerecord_type_loading.rb @@ -0,0 +1,38 @@ +# Activerecord every time it mades a connection brings all the `pg_type` +# data into a cache in order to do the relation between pg types and rails +# types +# +# What is the problem? +# +# Well in our users database we have 300K type. AR picks ~142K which leads to +# spent ~1.3s picking the data and ~0.5s in processing those records so we end +# spending about ~2s or more without needed in all our in_database operations +# +# How this fix works? +# +# Well, we filter all the table types (table, analysis tables, overviews) because +# in our app they aren't going to be used and in case they're need, Rails is going +# to query the database for it, so no problem. +module ActiveRecord + module ConnectionAdapters + module PostgreSQL + module OID # :nodoc: + class TypeMapInitializer # :nodoc: + def query_conditions_for_initial_load(type_map) + known_type_names = type_map.keys.map { |n| "'#{n}'" } + known_type_types = %w('r' 'e' 'd') + <<-SQL % [known_type_names.join(", "), known_type_types.join(", ")] + LEFT JOIN pg_type as tt ON (tt.typtype = 'c' AND tt.typarray = t.oid AND tt.typinput = 'record_in(cstring,oid,integer)'::regprocedure) + WHERE + tt.oid is null + AND (t.typname IN (%s) + OR t.typtype IN (%s) + OR t.typinput = 'array_in(cstring,oid,integer)'::regprocedure + OR t.typelem != 0) + SQL + end + end + end + end + end +end