예제테이블 > A TABLE
================================================
PK_ID | AName | BName | A_Name_Backup | B_Name_Backup | Price
---------------------------------------------------------------------------------------
1 과일 사과 NULL NULL 2000
2 과일 포도 NULL NULL 5000
3 NULL NULL 과일 복숭아 3200
4 스포츠 자전거 NULL NULL 12000
5 NULL NULL 스포츠 아령 3000
데이타가 약 5만개가 있습니다 AName과 Bname에 데이타가 널이면 A_Name_Backup | B_Name_Backup 필드를 조회하라고 쿼리를 짰는데 속도가 너무느립니다
실제필드는 하나의 테이블에 150개가 넘습니다
기존에 이렇게 되어 있더라구요
select * from A TABLE
WHERE (ISNUL(A_Name_Backup, AName) = '과일' AND (ISNUL(A_Name_Backup, Name) = '과일')
or (ISNUL(A_Name_Backup, AName) = '과일' AND (ISNUL(A_Name_Backup, Name) = '복숭아')
이런 식으로 하니까 속도가 늦더라구요 어떤분이 위처럼 하면 풀스캔을 하게 된다고 다른 방식으로 하라고 하는데 좋은생각이 안납니다
도와주세요
Comment 8
-
자리비움
2017.11.14 10:30
-
문상연
2017.11.14 13:07
별 차이가 없는거 같습니다
-
자리비움
2017.11.14 14:11
기술하신 where 절만 놓고 보면, 컬럼을 가공하기 때문에 인덱스가 있어도 full scan 입니다.
가공하는 부분을 or 절로 풀라는 얘기이고, 당연히 a_name 컬럼과 a_name_backup 컬럼에 인덱스가 있어야 합니다.
-
희망나라
2017.11.14 13:41
풀스캔을 피할려면 인덱스는 반드시 만드셔야 할겁니다.
1)인덱스을 활용할수 있도록 테이블 구성
2)select 할때 * 보다는 필요한 필드는 나열
위 두가지정도만으로도 성능은 개선될듯 합니다.
-
문상연
2017.11.14 16:41
인덱스는 물론 걸려있고요 그런데 그게 제대로 걸렸는지 모르겠네요
조회할때도 * 를 안하고 필요한 필드만 불러옵니다
-
딸기대빵
2017.11.15 14:45
저처럼 초보시라면 데이터베이스의 엔진튜닝관리자의 분석을 써보심도 좋을듯합니다.
완벽하진 않지만 필요한 인덱스를 생성해줍니다.
-
문상연
2017.11.16 10:20
이제야 봣네요 엔진튜닝관리자가 뭔지를 모르겠지만 고맙습니다
-
이리
2017.11.16 10:25
실행계획이 있어야 분석이 잘 될거 같습니다.
where 절에 isnull 처리 대신 or 로 분리하시면 될 듯 하네요.