Предлагаете модификации хранилища для более эффективного выполнения запроса?
Предположим, у меня есть запрос, возвращающий атрибут R:a со вторым по величине числом различных значений (возвращаем имя таблицы и имя атрибута). Моя задача:
Для каждого отдельного значения одного и того же атрибута R:a верните отдельное значение как val и количество кортежей в R, имеющих это значение как count. Показать результаты для этих различных значений, так что 20% кортежей R имеют равные или более низкие значения R:a, а 20% кортежей R имеют более высокие или равные значения R:a.
Предложите изменения в хранилище, чтобы запрос выполнялся как можно эффективнее.
Я написал запрос для возврата различных значений и подсчетов, но как мне показать 20% результатов и что вообще означают модификации хранилища в этом контексте?
SELECT pg_stats.tablename,pg_stats.attname,UNNEST(pg_stats.most_common_vals::text::varchar[]) as val, UNNEST(pg_stats.most_common_freqs)*pg_class.reltuples as count
FROM information_schema.columns,pg_stats,pg_class,
( SELECT T.tablename,T.attname
FROM (
SELECT pg_stats.tablename, pg_stats.attname, pg_stats.n_distinct as distval
FROM information_schema.columns,pg_stats
WHERE pg_stats.tablename = table_name AND pg_stats.attname = column_name AND (NOT (information_schema.columns.table_schema LIKE 'pg_%' OR information_schema.columns.table_schema = 'information_schema')) AND (information_schema.columns.data_type ='character varying') AND (table_name NOT in (SELECT viewname FROM pg_views))
LIMIT 5) as T
ORDER by T.distval DESC limit 1 offset 1) as temp
WHERE (pg_stats.tablename = table_name AND pg_stats.attname = column_name AND (NOT
(information_schema.columns.table_schema LIKE 'pg_%' OR
information_schema.columns.table_schema
= 'information_schema')) AND (information_schema.columns.data_type ='character varying') AND
(table_name NOT in (SELECT viewname FROM pg_views))
AND pg_stats.tablename = relname AND temp.tablename = pg_stats.tablename AND temp.attname =
pg_stats.attname);