2016-10-03 4 views
2

나는이 MySQL의에서 다음과 같은 기능호출 MySQL의 기능은 명령 프롬프트에서 혼자 함수를 호출보다 훨씬 더 많은 시간이 소요

CREATE FUNCTION `get_project_uuid`(project_kee varchar(400)) RETURNS varchar(50) CHARSET utf8 
BEGIN 
    declare v_project_uuid varchar(50); 
    select project_uuid into v_project_uuid from projects where scope='PRJ' and kee=project_kee; 
RETURN v_project_uuid; 
END 

내가 MySQL의 명령 프롬프트에서이 함수를 직접 실행을 몇 밀리 초 만에 실행되지만 다른 select 문에서이 함수를 사용할 때 해당 hosing select 문을 실행하는 데 2-3 분 정도 걸립니다. 나는 함수에서 select 문을 가지고 호스팅 select 문이 아닌 함수 호출에 직접 사용하는 경우

select * from issues where project_uuid = get_project_uuid('Project1') 

는 그러나, 몇 밀리 초 단위로 작동합니다.

select * from issues where project_uuid = (
    select project_uuid from projects 
    where scope='PRJ' and kee='Project1' 
) 

이 기능을 사용하는 것이 너무 오래 걸리는 경우가 많습니다. 이제는 더 긴 시간 때문에이 기능을 사용하지 않아야합니다. 내가 놓친 게 있니?

+0

선택을 수행하는 대신 하드 코딩 된 값을 반환하는 더미 함수를 작성 하시겠습니까? 그것은 절차 자체의 구성에 잘못된 것이 있는지 알려줄 것입니다. – blackpen

+0

'BEGIN '앞에 키워드'DETERMINISTIC'을 추가하십시오. 그것은 한 번만 계산하도록 mysql에게 알려줄 것이다. – Solarflare

+0

@blackpen : 귀하의 질문을 정확하게 이해했는지 확신 할 수 없습니다. 사람이 읽을 수있는 데이터 즉 프로젝트 이름을 제공하고 그 대가로 동일한 프로젝트를 나타내는 오랫동안 읽을 수없는 고유 키를 얻습니다. 중요한이 읽을 수없는 고유 키는 다른 테이블의 외래 키로 사용되므로 읽을 수있는 프로젝트 이름을 제공하여이 고유 키 (이 경우 uuid)를 가져 오는 함수를 작성하는 것이 편리합니다. – brunns

답변

1

명령 줄에서 get_project_uuid() 함수를 호출하면 한 번만 호출되므로 더 빠르게 실행됩니다.

select 문 (질문의 두 번째 코드 섹션)에서이 함수를 사용하면 명세서에 따라이 함수는 outer select 문에 사용 된 테이블 문제의 각 행에 대해 호출 될 수 있습니다. 이제 문제 테이블에 많은 행이있는 경우 실행하는 데 시간이 오래 걸릴 수 있습니다.

마지막으로 세 번째 코드 블록의 경우 mysql이 이슈 테이블의 모든 행에 대해 내부 SELECT 문을 실행하지 않기 때문에 빠를 수 있습니다. 이는 내부 select.과 동일한 값을 사용하여 최적화의 일부로 수행됩니다.

이 함수를 사용하고 더 빨리 원하는 경우 함수를 결정적으로 선언 할 수 있습니다. 같은 입력이 주어지면 항상 동일한 출력을 생성하는 함수를 결정적으로 선언 할 수 있습니다. 이제는이 사건이 귀하의 사건에 적용되는지 여부를 결정해야합니다. Mysql은 결정적이지 않은 함수를 잘못 선언하면 불평하지 않습니다. 그러나 그렇게함으로써 잘못된 결과를 얻는 것은 당신입니다.

관련 문제