# rails-0006: PostgreSQL schema_statements — O(C×I) include_columns Array#include? in reject **Severity:** MEDIUM **File:** activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb **Line:** 133-139 **Status:** PATCHED ## Description When loading PostgreSQL index metadata, `include_columns` is built as an Array by splitting and mapping the include clause. Then `columns.reject! { |c| include_columns.include?(c) }` scans the full include_columns Array for each column — O(C×I) where C = column count and I = include_column count. This runs during every schema reflection call (e.g., `connection.indexes(table_name)`), which is invoked on every model class load and on every `db:schema:dump`. ## Root Cause `include.split(",").map { ... }` returns an Array. The subsequent `Array#include?` in the `reject!` block is O(I) per column. ## Fix ```ruby # BEFORE include_columns = include ? include.split(",").map { |c| Utils.unquote_identifier(c.strip.gsub('""', '"')) } : [] columns.reject! { |c| include_columns.include?(c) } # AFTER include_set = include ? include.split(",").map { |c| Utils.unquote_identifier(c.strip.gsub('""', '"')) }.to_set : Set.new columns.reject! { |c| include_set.include?(c) } ``` ## Speedup ~50x at C=500 columns, I=200 include columns