Повышение производительности для формы поиска с диапазоном дат в Postgresql - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть форма поиска, где передано 4 параметра. Это:

:status -> string and can be ['SUCCESS', 'FAILURE', 'INPROGRESS'], :partner -> string, 
:fromDate -> timestamp with time zone, :toDate-> timestamp with time zone,

Я решаю проблемы производительности для формы поиска по следующему запросу

SELECT
    t.request_no, t.MODE,
    t.service_type,
    t.amount_in_som,
    t.description,
    t.status 
FROM
    main_transaction t 
WHERE
    (:status = 'UNKNOWN' OR t.status = :status)  --if UNKNOWN means select all 
    AND t.transaction_type = 'WITHDRAW'
    AND t.status <> 'INPROGRESS'
    AND t.pub_date >='2018-10-01' -- :fromDate
    AND t.pub_date <='2018-11-07' -- :toDate
AND CASE
    WHEN :partner ='A1' 
        AND ( t.service_type = 'SERVICE_1' OR t.service_type = 'SERVICE_2' OR t.service_type = 'SERVICE_3' ) 
        AND (t.MODE = 'AUTO' OR  t.MODE = 'AUTO_1'  OR  t.MODE = 'AUTO_2'  OR  t.MODE = 'AUTO_3') THEN TRUE 
    WHEN :partner ='A2' 
        AND ( t.service_type = 'SERVICE_1' OR t.service_type = 'SERVICE_2') 
        AND t.profile_id = 4287 THEN TRUE ELSE FALSE 
    END = TRUE

Возвращение результата в течение 4 секунд. Я хочу сократить рабочее время, используя индексирование таблиц или что-то еще? Итак, как я могу увеличить производительность для этого запроса?

Я выбираю из следующей таблицы:

CREATE TABLE main_transaction (
   id integer NOT NULL DEFAULT nextval('main_transaction_id_seq'::regclass),
   description character varying(255) NOT NULL,
   request_no character varying(18),
   account character varying(50),
   service_type character varying(50),
   pub_date" timestamptz(6) NOT NULL,
   "service_id" varchar(50) COLLATE "pg_catalog"."default",
   ....
 )

В приведенной выше таблице содержится 34 столбца, включая 3 КЛЮЧА ИНОСТРАННЫХ, и более 3 миллионов строк данных.

Объясните:

"Seq Scan on main_transaction transactio0_  (cost=0.00..322285.41 rows=103067 width=88) (actual time=0.248..2721.617 rows=158846 loops=1)"
"  Filter: (((status)::text <> 'INPROGRESS'::text) AND (pub_date >= '2018-10-01 00:00:00+05'::timestamp with time zone) AND (pub_date <= '2018-11-07 00:00:00+05'::timestamp with time zone) AND ((transaction_type)::text = 'WITHDRAW'::text) AND CASE WHEN ((((service_type)::text = 'SERVICE_1'::text) OR ((service_type)::text = 'SERVICE_2'::text) OR ((service_type)::text = 'SERVICE_3'::text)) AND (((mode)::text = 'AUTO'::text) OR ((mode)::text = 'AUTO_1'::text) OR ((mode)::text = 'AUTO_2'::text) OR ((mode)::text = 'AUTO_3'::text))) THEN true ELSE false END)"
"  Rows Removed by Filter: 2567005"
"  Buffers: shared hit=15344 read=204722"
"Planning time: 0.232 ms"
"Execution time: 2729.562 ms"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...