테이블과 인덱스, 파티션의 질문 0 4 582

by 아니8083 [MySQL] [2019.07.08 13:02:42]


안녕하세요, 작은 회사에서 DBA를 수행하고 있습니다.

 

인덱스는 아래 테이블 명세서에 파티션과 모두 있습니다.

여기서 질문이 하나 생겼습니다.

다름이 아니옵고

select * from POP_MOVE_TEMP2 where ETL_YMD = 20180101

로 실행하려고 할 때 아래와 같은 실행 목표가 나오고

실제 데이터가 있는데도 데이터가 나오지 않습니다.

건수가 약 테이블이 4억건 정도 되어서 성능이 너무 나오지 않는데

성능 향상을 위한 팁을 얻을 수 있을까요?

 

 

 

 

 

 

/*---------------------------------------------

-- 오브젝트명: `KT_MOVE`.`POP_MOVE_TEMP2`

-- 생성일자 : 2019-07-04 20:28:01.0

-- 상태: VALID

---------------------------------------------*/

CREATE TABLE `KT_MOVE`.`POP_MOVE_TEMP2`

(

    `ID`       int(20),

    `X_COORD`  varchar(20)   CHARACTER SET utf8 COLLATE utf8_general_ci,

    `Y_COORD`  varchar(20)   CHARACTER SET utf8 COLLATE utf8_general_ci,

    `HT`       int(5),

    `M00`      double(10,2),

    `M10`      double(10,2),

    `M15`      double(10,2),

    `M20`      double(10,2),

    `M25`      double(10,2),

    `M30`      double(10,2),

    `M35`      double(10,2),

    `M40`      double(10,2),

    `M45`      double(10,2),

    `M50`      double(10,2),

    `M55`      double(10,2),

    `M60`      double(10,2),

    `M65`      double(10,2),

    `M70`      double(10,2),

    `F00`      double(10,2),

    `F10`      double(10,2),

    `F15`      double(10,2),

    `F20`      double(10,2),

    `F25`      double(10,2),

    `F30`      double(10,2),

    `F35`      double(10,2),

    `F40`      double(10,2),

    `F45`      double(10,2),

    `F50`      double(10,2),

    `F55`      double(10,2),

    `F60`      double(10,2),

    `F65`      double(10,2),

    `F70`      double(10,2),

    `TOT`      double(10,2),

    `MEGA_CD`  int(11),

    `ETL_YMD`  int(10),

    `ADMI_CD`  int(15)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=Dynamic

PARTITION BY RANGE (ETL_YMD)

(

 PARTITION `p201601` VALUES LESS THAN (20160131) ENGINE=InnoDB, 

 PARTITION `p201602` VALUES LESS THAN (20160231) ENGINE=InnoDB, 

 PARTITION `p201603` VALUES LESS THAN (20160331) ENGINE=InnoDB, 

 PARTITION `p201604` VALUES LESS THAN (20160431) ENGINE=InnoDB, 

 PARTITION `p201605` VALUES LESS THAN (20160531) ENGINE=InnoDB, 

 PARTITION `p201606` VALUES LESS THAN (20160631) ENGINE=InnoDB, 

 PARTITION `p201607` VALUES LESS THAN (20160731) ENGINE=InnoDB, 

 PARTITION `p201608` VALUES LESS THAN (20160831) ENGINE=InnoDB, 

 PARTITION `p201609` VALUES LESS THAN (20160931) ENGINE=InnoDB, 

 PARTITION `p201610` VALUES LESS THAN (20161031) ENGINE=InnoDB, 

 PARTITION `p201611` VALUES LESS THAN (20161131) ENGINE=InnoDB, 

 PARTITION `p201612` VALUES LESS THAN (20161231) ENGINE=InnoDB, 

 PARTITION `p201701` VALUES LESS THAN (20170131) ENGINE=InnoDB, 

 PARTITION `p201702` VALUES LESS THAN (20170231) ENGINE=InnoDB, 

 PARTITION `p201703` VALUES LESS THAN (20170331) ENGINE=InnoDB, 

 PARTITION `p201704` VALUES LESS THAN (20170431) ENGINE=InnoDB, 

 PARTITION `p201705` VALUES LESS THAN (20170531) ENGINE=InnoDB, 

 PARTITION `p201706` VALUES LESS THAN (20170631) ENGINE=InnoDB, 

 PARTITION `p201707` VALUES LESS THAN (20170731) ENGINE=InnoDB, 

 PARTITION `p201708` VALUES LESS THAN (20170831) ENGINE=InnoDB, 

 PARTITION `p201709` VALUES LESS THAN (20170931) ENGINE=InnoDB, 

 PARTITION `p201710` VALUES LESS THAN (20171031) ENGINE=InnoDB, 

 PARTITION `p201711` VALUES LESS THAN (20171131) ENGINE=InnoDB, 

 PARTITION `p201712` VALUES LESS THAN (20171231) ENGINE=InnoDB, 

 PARTITION `p201801` VALUES LESS THAN (20180131) ENGINE=InnoDB, 

 PARTITION `p201802` VALUES LESS THAN (20180231) ENGINE=InnoDB, 

 PARTITION `p201803` VALUES LESS THAN (20180331) ENGINE=InnoDB, 

 PARTITION `p201804` VALUES LESS THAN (20180431) ENGINE=InnoDB, 

 PARTITION `p201805` VALUES LESS THAN (20180531) ENGINE=InnoDB, 

 PARTITION `p201806` VALUES LESS THAN (20180631) ENGINE=InnoDB, 

 PARTITION `p201807` VALUES LESS THAN (20180731) ENGINE=InnoDB, 

 PARTITION `p201808` VALUES LESS THAN (20180831) ENGINE=InnoDB, 

 PARTITION `p201809` VALUES LESS THAN (20180931) ENGINE=InnoDB, 

 PARTITION `p201810` VALUES LESS THAN (20181031) ENGINE=InnoDB, 

 PARTITION `p201811` VALUES LESS THAN (20181131) ENGINE=InnoDB, 

 PARTITION `p201812` VALUES LESS THAN (20181231) ENGINE=InnoDB, 

 PARTITION `p201901` VALUES LESS THAN (20190131) ENGINE=InnoDB, 

 PARTITION `p201902` VALUES LESS THAN (20190231) ENGINE=InnoDB, 

 PARTITION `p201903` VALUES LESS THAN (20190331) ENGINE=InnoDB, 

 PARTITION `p201904` VALUES LESS THAN (20190431) ENGINE=InnoDB, 

 PARTITION `p201905` VALUES LESS THAN (20190531) ENGINE=InnoDB, 

 PARTITION `p201906` VALUES LESS THAN (20190631) ENGINE=InnoDB, 

 PARTITION `p201907` VALUES LESS THAN (20190731) ENGINE=InnoDB, 

 PARTITION `p201908` VALUES LESS THAN (20190831) ENGINE=InnoDB, 

 PARTITION `p201909` VALUES LESS THAN (20190931) ENGINE=InnoDB, 

 PARTITION `p201910` VALUES LESS THAN (20191031) ENGINE=InnoDB, 

 PARTITION `p201911` VALUES LESS THAN (20191131) ENGINE=InnoDB, 

 PARTITION `p201912` VALUES LESS THAN (20191231) ENGINE=InnoDB, 

 PARTITION `pmax` VALUES LESS THAN (MAXVALUE) ENGINE=InnoDB

);

 

 

 

 

by 우리집아찌 [2019.07.08 14:07:43]

일단 하나의 테이블에 너무 많은 데이터 문제면 파티셔닝 테이블로 가져가는게 맞습니다

 

다만 일/월/년단위로 가야할지는 전체 기간대비 양을 봐야합니다

주의할점은 조회sql에서는 파티션키가 항상 조회조건으로 있어야 합니다. 그렇지않으면 파티션 전체를 읽을수 있습니다

또한 파티셔닝 테이블은 일반 테이블대비 아무래도 관리(파티션 추가/삭제등등)라는것이 더 필요합니다.

 


by 아니8083 [2019.07.08 15:39:20]

 

한가지만 더 질문 드립니다. 20180101 에 데이터가 실제로 있음에도 불구하고, 아래처럼 데이터가 없는 것으로 조회되는 이유가 있을까요? 
빨리 조회를 해서 줘야 해서, 어렵게 부은 테이블인데 속을 썩이네요 ㅠㅠ

select * from POP_MOVE_TEMP2 where ETL_YMD between  20180101 and 20180131;

;


by 우리집아찌 [2019.07.08 17:19:57]

흠 안나오는 이유는 잘모르겠네요

조회조건을 하나만 해보세요

그리고 파티션 나눌때 less then (20160131) -> less then (20170201) 바꾸셔야합니다

 


by 마농 [2019.07.08 19:27:17]

1. 있는데 안나온다면?
 - 버그이거나
 - 없는데 있다고 착각하거나
2. 파티션 구문에서
 - less then 작다는 뜻인 듯 합니다.
 - 이퀄 조건이 아니므로 이번달 말일이 아닌 다음달 1일이 와야 할 듯.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입