CREATE TABLE `tbl_trend` (
`FLD_DATE` char(14) NOT NULL, -- 저장날짜
`FLD_AGENT_ID` int(10) unsigned NOT NULL, -- 에이전트 ID
`FLD_CONVERTER_ID` tinyint(3) unsigned NOT NULL, -- 컨버터 ID
`FLD_CONTROLLER_ID` tinyint(3) unsigned NOT NULL, -- 컨트롤러 ID
`FLD_TAG_ADDRESS` smallint(5) unsigned NOT NULL, -- 태그 주소
`FLD_MAX` double NOT NULL, -- 최대값
`FLD_MIN` double NOT NULL, -- 최소값
`FLD_AVG` double NOT NULL, -- 평균값
`FLD_GUIDE_VALUE` double NOT NULL, -- 설정값
`FLD_IS_USE_GUIDE` tinyint(4) NOT NULL DEFAULT '0',
KEY `IDX1_TBL_TREND` (`FLD_DATE`,`FLD_CONTROLLER_ID`,`FLD_TAG_ADDRESS`,`FLD_CONVERTER_ID`,`FLD_AGENT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
DB 초짜 질문이요.
위와 같은 테이블과 인덱스를 구성했습니다.
각 에이전트에는 다수의 컨버터가 있고,
각 컨버터에는 다수의 컨트롤러가 있고,
각 컨트롤러에는 다수의 태그 주소가 있으며,
태그 주소별로 최대값, 최소값, 평균값, 설정값 등이 일정시간마다 저장됩니다.
궁금한건 어느 순간부터 select 속도가 너무 느려졌다는 겁니다.
현재 총 데이터량이 7000만건 정도되는데
특정 에이전트 - 특정 컨버터 - 특정 컨트롤러 - 특정 태그주소를 지정날짜 범위로 select하여 약80만건 조회되는데 2분정도 걸립니다. 너무 오래 걸리는것 같은데 어떻게 조치를 취해야할지 난감합니다.
조회는 아래처럼 프로시저를 생성해서 조회했습니다.
CREATE PROCEDURE SP_Select
(
in v_agent_id int unsigned,
in v_converter_id tinyint unsigned,
in v_controller_id tinyint unsigned,
in v_tag_address smallint unsigned,
in v_start_date char(14),
in v_end_date char(14)
)
begin
select fld_date, fld_max, fld_min, fld_avg, fld_guide_value, fld_is_use_guide
from TBL_TREND
where fld_agent_id = v_agent_id
and fld_converter_id = v_converter_id
and fld_controller_id = v_controller_id
and fld_tag_address = v_tag_address
and fld_date between v_start_date and v_end_date
order by fld_date;
end
|