lib/queries/duplicate_indexes.ex

defmodule EctoPSQLExtras.DuplicateIndexes do
  @behaviour EctoPSQLExtras

  def info do
    %{
      title: "Multiple indexes that have the same set of columns, same opclass, expression and predicate.",
      index: 7,
      columns: [
        %{name: :size, type: :string},
        %{name: :idx1, type: :string},
        %{name: :idx2, type: :string},
        %{name: :idx3, type: :string},
        %{name: :idx4, type: :string}
      ]
    }
  end

  def query(args \\ []) do
    """
    /* ECTO_PSQL_EXTRAS: Multiple indexes that have the same set of columns, same opclass, expression and predicate */

    SELECT pg_size_pretty(sum(pg_relation_size(idx))::bigint) as size,
       (array_agg(idx))[1]::text as idx1, (array_agg(idx))[2]::text as idx2,
       (array_agg(idx))[3]::text as idx3, (array_agg(idx))[4]::text as idx4
    FROM (
        SELECT indexrelid::regclass as idx, (indrelid::text ||E'\n'|| indclass::text ||E'\n'|| indkey::text ||E'\n'||
        coalesce(indexprs::text,'')||E'\n' || coalesce(indpred::text,'')) as key
      FROM pg_index) sub
    GROUP BY key HAVING count(*)>1
    ORDER BY sum(pg_relation_size(idx)) DESC;
    """ |> EEx.eval_string(args)
  end
end