DB 풀스캔에 관하여 질문드립니다. 0 1 794

by 파니동 [SQL Query] [2019.02.10 12:39:41]


샘플테이블.png (4,612Bytes)

안녕하세요.

쿼리 작성 중에 DB 풀스캔에 대하여 듣게 되었는데요.

 

하단 이미지에 나와있는 테이블에서 해당 날짜로 조회하여 데이터를 조회한다고 했을 때 기존에는 아래처럼 조회하여 가져왔습니다.

SET @searchDate = '2018-09-20';

SELECT*
FROM fullscantest
WHERE date_format(regDate, '%Y-%m-%d') = @searchDate;

 

그런데 이렇게 조회하면 DB FULL SCAN이 떠서 조회 조건에 들어가는 컬럼에는 절대 가공하면 안된다고해서 아래 처럼 쿼리를 변경하였습니다.

SET @searchDate = '2018-09-20';

SELECT*
FROM fullscantest
WHERE regDate >=  concat(date_format(@searchDate, '%Y-%m-%d'), ' 00:00:00')
AND regDate <=  concat(date_format(@searchDate, '%Y-%m-%d'), ' 23:59:59');

 

FullScan 을 예방하기 위한 쿼리가 저렇게 하는게 맞을까요??

쿼리가 길어지는게 뭔가 찜찜하긴 하지만 어떻게 조회하는게 가장 좋은건지 궁금합니다.

by 마농 [2019.02.11 08:44:01]

컬럼을 가공하여 조건값과 비교하지 마시고.
컬럼은 그대로 둔 채 조건값을 가공하여 컬럼에 맞추세요.
해당 컬럼의 자료형이 중요합니다.
문자형인지? 날짜형인지에 따라 조건값을 해당 형태에 맞춰 줘야 합니다.
함수 사용이 비효율적입니다.
date_format 은 날짜를 문자로 바꾸는 함수입니다.
그런데 문자를 대입했으므로 문자가 날짜로 형변환 된 뒤 다시 문자로 되는 형태입니다.
결국 입력갑과 결과값이 똑같이 문자입니다. 함수를 사용하나 마나 한 결과입니다.
concat 을 이용해 '00:00:00' 을 붙였는데. 굳이 안붙여도 됩니다.
 

SELECT*
  FROM fullscantest
 WHERE regDate >= @searchDate
   AND regDate <= CONCAT(@searchDate, ' 23:59:59')
;

SELECT*
  FROM fullscantest
 WHERE regDate >= @searchDate
   AND regDate <  @searchDate + INTERVAL 1 DAY
;

 

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