В целом все красиво, но, есть одно select * from table limit 0 работает дольше чем ручной обход схемы на больших таблицах. А вообще подход к решению шикарнейший. Меня остановил подобный путь чрезмерным расходом памяти. Хм, может перелинкуем наши решения?
Особенно если учесть, что запрос select + group + count(*) + order by count(*) всё равно потребует full scan'а индекса (да какой нафиг индекса, если to_char еще накладывается), так что пользы от оптимизационного геморроя я что-то не вижу.
Вопрос не глупый. Такой вариант конечно рассматривался, однако поверьте мне на слово мой вариант работает быстрее. UNION — очень тяжеловесная операция, так как необходимо делать ORDER BY уже после объединения данных. Т.е. в моем варианте ORDER BY происходит для каждого столбца в отдельности за приемлимое время (однако не маленькое), а в случае с UNION эта сортировка происходит для всех данных вместе. Сравните: отсортировать 100 столбцов по миллиону записей в отдельности и отсортировать все эти данные после объединения. Выигрыш серьезный получается.
по крайней мере в CUBRID.
Я попробовал различные способы. Этот получился наиболее быстрым.
Нет, я про вариант с union :) А так — гораздо эффективней решение чем union. Нечто среднее — память/скорость. У меня скорость ниже, но памяти меньше расходуется.
Решение задачи второго конкурса CUBRID it!