아까 밑에 데이터 수 십만행 넘어가니


다른 테이블과 조인 없고, 그냥 이 테이블로만 페이징하는데 시간 좆나 늘어난다고 물어봤는데


찾아보니까 특정 컬럼 때문에 인덱스 사용을 못하더라고 (그 컬럼에 인덱스는 걸어뒀음)


1. 시간 좆나게 늘어지게하는 컬럼 2개 발견함


2. 이 컬럼들 특징이 다른 PK테이블과 참조 관계에 있는 컬럼들임 (A컬럼, B컬럼이라고 칭하겠음)


3. A컬럼(FK)의 행들에는 딱 2가지의 문자열 값만 있음 Empty, ABCDE 그리고 PK에는 당연히 저 2가지 값이 있고...


4. B컬럼(FK)의 행들에는 딱 1가지의 문자열 값만 있음 Empty 그리고 PK에도 저 Empty 값만 있는 중


------


페이징에 검색 조건들마다 분기하고 하면 노가다 심하니까 모든 컬럼에 다 인덱스 비용 지불하고 편하게 Col1 LIKE @param1 + '%' AND Col2 LIKE @param2 + '%'....


이렇게 사용 중이고 페이징 위해서 Where ........ AND Number NOT IN ( TOP(...) .... Where ... )  이런 식으로 innerJoin 발생되는 중


------


컬럼들이 20개 정도되는데 나머지 18개는 실행하면 바로 결과 뱉음, 퍼포먼스 문제 없음


저 2개의 컬럼들이 문제인데... 예를 들어 Empty와 ABCDE라는 PK값만 있는 참조관계에 있는 A컬럼을 조건문에 추가하면 결과 뱉는데 몇초로 늘어남


그리고 Empty값만 있는 PK와 참조 관계에 있는 B컬럼을 조건문에 추가하면 아주 오래걸림 


그리고 쿼리 실행 플랜 들여다보니 저 B컬럼을 추가하면 Index Missing 발생함... 


Empty만 있어서 그런가? 저 Empty만 있는 PK 테이블 인덱스 들여다보면 인덱스로 ssd공간 쓰고 있고 인덱싱 되어있던데...


그리고 별 상관 없을 거 같지만 모두 NONCLUSTERED INDEX임... 



컬럼들이 allow null 해두면 컨트롤러에서 귀찮아서 db에는 모두 not null로 해두고 대신 참조관계 맺어야하는 곳들끼리 겹쳐서 검색할 때


한쪽은 값 있으면 한 쪽은 빈 값이어야해서 PK테이블에 Empty로 행 하나 넣어두고 그걸 참조하게 했는데


데이터 공간을 비용으로 그냥 지불하고 노가다 줄이려고 했는데 이런 문제를 맞닦뜨리니 너무 귀찮다...


그럼 왜 empty값만 들어있는 pk와 참조관계에 있는 fk컬럼에서 인덱스 미싱이 발생하는지 구글링하러 가볼게...


nosql쓰면 아예 조인이 없으니 그냥 편하게 되지 않나? nosql nosql 요즘 많이들 쓰던데 트랜잭션만 잘되는 거 있으면 써보고 싶다.