database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30903 게시물 읽기
No. 30903
Where 절에 Function 사용시 key를 못타는 문제입니다.
작성자
김학영(akyo_k)
작성일
2015-11-26 19:29
조회수
6,282

사용자 아이디를 던지면 UID를 반환하는 GET_UID 라는 Function을 하나 만들었습니다.
동작은 입력받은 아이디로 SELECT 해보고 있으면 반환, 없으면 UID 하나 생성해서  INSERT 하고 반환하는 동작입니다.
 

SELECT GET_UID('test');
이렇게 실행하면 '2a4584fb-caa6-4d96-b5f1-1f7e39835023' 이렇게 UID를 반환합니다.

이걸 쿼리에 Where절에 넣었습니다.

SELECT UID, CREATE_DATE
FROM MONTHLY_DATA
WHERE UID = GET_UID('test');

이런식으로요. 데이터가 얼마 없는데도 불구하고, 1.5초정도 소요되는 상황입니다.

SET @UID = GET_UID('test');
SELECT UID, CREATE_DATE
FROM MONTHLY_DATA
WHERE UID = @UID;

이렇게 처리하면 직접
WHERE UID = '2a4584fb-caa6-4d96-b5f1-1f7e39835023'
한 것 처럼 금방 나오고 말이죠.

프레임워크에서 위와 같이 변수 선언해서 처리하면 에러를 뱉는 상황이라 고민하던중에 EXPLAIN 해보니
possible_keys가 NULL, key도 NULL입니다. (직접 UID에 값을 넣으면 PRIMARY로 지정해둔 인덱스를 잘 타고 있습니다.)
인덱스를 못타는 것 같은데, 혹시 왜 이런 현상이 생긴건지 아시는 분 답변 부탁드리겠습니다.

 


 

이 글에 대한 댓글이 총 2건 있습니다.

function 생성시 deterministic 옵션으로 만드셨나요?

정상규(pajama)님이 2015-11-27 16:04에 작성한 댓글입니다.

아무 옵션 넣지 않고 만들었습니다.
무슨 옵션인지 몰라서 검색해보고 DETERMINISTIC 옵션 넣고 만들었더니 인덱스를 타네요..ㅜㅜ

답변 감사드립니다.

김학영(akyo_k)님이 2015-12-01 10:04에 작성한 댓글입니다.
이 댓글은 2015-12-01 10:15에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
30907고수님들 sql문 작성하는데 질문있습니다ㅠㅠㅠ [3]
초짜
2015-12-09
6611
30905db랑 mysql 같은건가요? 설치법 질문! [2]
고준호
2015-12-07
6213
30904허접이가 고수님께.. [1]
허접이
2015-12-03
6283
30903Where 절에 Function 사용시 key를 못타는 문제입니다. [2]
김학영
2015-11-26
6282
309023개의 문을 하나로 합치고싶어요 [1]
김우성
2015-11-20
6356
30901원격으로 mysql 접속이 불가능합니다. [1]
k2il
2015-11-19
6566
30900group_concat관련 질문입니다. [2]
차정훈
2015-11-19
6192
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.056초, 이곳 서비스는
	PostgreSQL v14.2로 자료를 관리합니다