2009-08-05 2 views
4

쿼리에 SELECT 또는 WHERE 절의 UDF 호출이 포함 된 경우 MySQL 쿼리 실행 시간이 기하 급수적으로 저하됩니다. UDF는 스칼라 값을 반환하기 위해 로컬 테이블을 쿼리합니다. 따라서 산술 식만 수행하는 것이 아니라 상관 관계가있는 하위 쿼리로 사용됩니다. 나는 단순히 UDF를 제거하고 상관 하위 쿼리, 더 복잡한 조인 등으로 다시 작성함으로써 성능 문제를 해결했습니다.MySQL의 UDF 성능

MySQL에 대한 경험이있는 경우이를 단순히 현실로 받아들이고, UDF로 이동합니다. 하지만 MySQL을 사용하기 전에 SQL Server에서 5 년 이상 근무했습니다. 훨씬 더 큰 데이터 세트를 처리하는 결제 시스템을 구축하고 매우을 스칼라 및 테이블 값 사용자 정의 함수에 많이 의존했습니다. 그 UDF는 쿼리 (즉, 산술 연산이 아닌)도 수행했습니다. SQL Server에서 사용자 정의 함수를 사용할 때 이런 종류의 성능 저하가 발생하지 않았습니다.

내가 궁금해하는 점은 SQL Server와 MySQL 내부를 잘 아는 사람이 있는지, 현재 시스템에 UDF의 성능 차이가 있는지에 대한 현재의 이론을 설명 할 수 있는지 여부입니다. 내 이론은 SQL Server의 옵티마이 저가 MySQL과 다르게 UDF를 평가한다는 것입니다. 테이블 엔진이 MySQL에서 분리되어있을 가능성이 있습니다. 또는 SQL Server에서 UDF를 사용하는 것이 더 널리 보급되어 MySQL 엔진의 옵티마이 저는 단순히 아직까지 진화하지 않았습니까? 내가 생각하는 것은 아마도 SQL Server 최적화 프로그램이 포함 된 UDF를 주변 쿼리의 일부로 처리 한 다음 나머지 쿼리와 함께 최적화하는 것일 수도 있습니다. 어쩌면 나는 여기서 벗어날 수 있지만, SQL Server에서 UDF를 사용하는 경우 이런 종류의 성능이 저하되는 것을 본 적이 없습니다.

다른 사람들이이 문제에 관해 밝힐 수있는 모든 빛이 인정 될 것입니다.

답변

2

UDF에는 알려진 제한 사항과 문제점이 있습니다. 참조 : Are UDFs Harmful to SQL Server Performance?

이 주제에 대한 기사가 많이 있습니다. 바라기를 이것은 비가 입자 접근이다 : Beware Row-by-Row Operations in UDF Clothing

+1

처음에 나는 이것이 오히려 일반적인 응답이라고 생각했다. 그러나 두 번째로 링크 된 기사는 정확히 여기서 내가 잘못하고있는 것을 설명한다. 나는 바보 같지 않아. udf의 불행한 아킬레스 건. 나쁘다. 저장된 프로 시저가 사전 컴파일 될 때 주변 쿼리와 함께 구문 분석 및 최적화되지 않는다. udf의 코드 캡슐화가 제공 할 수있는 유지 보수 이점의 목적을 무력화시키는 것 같습니다. 어쨌든 신속하고 적절한 피드백에 감사드립니다. 이 기사에서 설명한대로 행 단위로 작업을 수행하지 않았기 때문에 SQL Server 2005의 기능을 사용할 수 없었습니다. – codemonkey

+0

이 답변의 첫 번째 링크를 업데이트 할 수 있습니까? – ghoti

+0

@GHOTI : 무엇을 업데이트 했습니까? 링크가 끊어지지 않습니다. –