안녕하세요
문의사항이 있어서 글을 남깁니다.
저희가 개발한 프로그램에서
고객정보를 조회하는 로직이 있습니다.
아래의 그림과 같은 화면 구조인데요.
여기서 [검색조건] 에는
이름/주민번호/핸드폰번호/기타 네가지 정보를 모두 자유롭게 입력할 수 있습니다. (모두 AND조건)
입력 후 검색을 하면 [조회결과] 리스트에 나오게 됩니다.
여기서 DB 테이블 구조가 아래와 같은 구조로 되어 있다고 하면. (인덱스는 각각의 필드에 따로따로 걸려 있습니다)
실제 프로시져는 어떤식으로 구성해야 퍼포먼스 손해를 덜 볼 수 있는지 궁금해서 여쭤봅니다.
일단 저는 아래와같이 프로시저 구성을 하긴 했는데요
CREATE PROCEDURE [dbo].[USP_Customer_L]
(
@이름 NVARCHAR(100),
@주민번호 NVARCHAR(100),
@핸드폰번호 NVARCHAR(100),
@기타 NVARCHAR(100)
)
AS
BEGIN
SELECT 이름, 주민번호, 핸드폰번호, 기타
FROM 고객정보
WHERE
(@이름 = '' OR (@이름 <> '' AND 이름 LIKE @이름 + '%' ))
AND (@주민번호 = '' OR (@주민번호 <> '' AND 주민번호 LIKE @주민번호 + '%' ))
AND (@핸드폰번호 = '' OR (@핸드폰번호 <> '' AND 핸드폰번호 LIKE @핸드폰번호 + '%' ))
AND (@기타 = '' OR (@기타 <> '' AND 기타 LIKE @기타 + '%' ))
END
이런식으로 프로시져 구성을 하니 쿼리 짜기는 편하기는한데..
막상 실행계획을 보니까 인덱스를 안타서 성능면에서 문제가 있더라구요
1. 매개변수의 경우의 수에 맞게 프로시저를 모두 구성해야 하는건지
ex) (1) [이름]
(2) [이름] [주민번호]
(3) [이름] [주민번호] [핸드폰번호]
(4) [이름] [주민번호] [핸드폰번호] [기타]
(5) [이름] [주민번호] [기타]
(6) [이름] [핸드폰번호]
(7) [이름] [핸드폰번호] [기타]
(8) [이름] [기타]
.
.
.
.
2. 아니면 다른 좋은 방법이 있을지 궁금해서 여쭤봅니다.
이름 LIKE @이름 + '%'