두개의 table이 있습니다.
1번 table : ip_list(임의 대역별 IP를 저장하고있는 table)
2번 table : ip_total(임의 대역을 저장하고있는 table)
※ 두개의 table에는 INSERT가 일어나지 않습니다.
ip_total table(45 row)
ip_total_idx(serial) | ip_age(inet) |
----------------------------------
1 | 133.255.255.0/24 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ip_list table(5800 row)
ip_list_idx(serial) | ip(inet) | flag | flag_time
-----------------------------------------------------
1 | 133.255.255.1 | t | 1234567890(unix_time)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(btree 인덱스가 ip 컬럼 에 걸려있음)
여기서 ip가 사용중이면 flag값이 t로 업데이트 되면서 flag_time도 업데이트 가 이루어지고. 미사용중이면 flag값이 f로 업데이트되면 flag_time도 업데이트가
됩니다,
위사항을 포함해서 하루의 대략 ip_list의 table의 3000번정도의 업데이트 이루어집니다.
여기서 문제는
두개의 table을 아래 조건으로 SELECT 했을때
WHERE ip << ip_age
AND flag='f'
AND to_timestamp((s.flag_time::integer + 86400)::double precision) < now()
(설명: ip가 ip_total table 대역의 포함되고, 미사용중이고, 미사용시간이 하루이상이 지난 IP를 SELECT 함)
몇일은 Query의 속도가 괜찮다가,, 이후 한 보름정도 지나면, SELECT 의 속도가 현저히 지연됩니다.
그래서 현재는 계속 transaction처리(VACUUM)을 수동으로 하고 다시 정상의 속도로 만듭니다.
table을 재정규화나, Query 수정, 인덱스 재처리를 해봤는데도, 시일이 지나면 다시 똑같습니다.
이 문제를 해결할수있는 방안이 있을까요?
|