안녕하세요.
mariadb 10.2.15를 사용중입니다.
상품코드를 파라메터로 받아서 현재가용재고를 리턴하는 fuction을 만들었습니다. fn_stock(창고코드,고객사코드,상품코드)
개별상품코드 하나씩 호출하면 0.0xx초 걸립니다.(0.1초를 절대 넘지 않습니다.)
특정고객사 기준으로 가용재고가 적은(단 0보다 큰) 상품을 4개만 찾는 쿼리를(select문을) 만들었습니다.
실제 상품개수가 많은 고객사도 모든 상품개수는 400개를 넘지 않고,하나의 테이블에서 바로 조회가능합니다.
실제로는 고객사별사용창고 테이블도 조인을 걸어야 하지만 pk로 연결되고,
상품테이블안에 고객사코드도 있습니다.
아주 간단하고,건수도 많지 않습니다.(테스트 환경이라 커넥션도 거의 없습니다.)
근데,select문을 실행 하면,..1분이 지나도 안나옵니다.
겨우 400번의 function을 돌려는데 이정도 입니다.
하도 답답해서 procedure를 만들어서
cursor문으로 400개의 상품들에 대해서 fn_stock()을 호출해봤습니다.
cursor문 안에
set v= fn_stock();
set cnt = cnt + 1
커서 닫은 후에 select v,cnt 해서 결과를 확인 했습니다.
실행시간은 0.29초...실행결과도 cnt값 기준으로 원래의 로우개수 만큼 출력해줍니다.;;
아놔~~!
이런 경험이 있으신분 있을까요?
버전을 올려야 한다거나,
db의 buffer size를 조절해서 이게 해결이 가능할까요?
감사합니다.
펑션의 결과에 조건도 주고 정렬도 하는 걸로 보입니다.
이렇게 되면 한 레코드당 펑션이 한번만 수행되는게 아니라 여러번 수행 될 가능성도 있습니다.
또한 정렬은 부하가 많은 작업입니다.
펑션 자체도 0.00x 가 아닌 0.0x 라면 시간도 많이 소요되는 걸로 보이네요.
펑션을 없애고 조인으로 바꾸는게 좋습니다.
펑션을 사용해야 한다면? 펑션 내 비효율은 없는지 확인해 보셔야 합니다.
펑션을 호출하는 쿼리도 비효율은 없는지 확인해 봐야 합니다.