안녕하세요. 파이썬 초보입니다.
1. DB에서 JOIN하여 VIEW를 만들어두고 백엔드에서 SELECT WHERE로 가져오기
2. 백엔드에서 1과 동일한 JOIN SELECT WHERE문을 실행
둘중 어느 것이 성능면에서 유리할까요?
현재 1처럼 사용 중인데 쿼리 변경이 유연하지 않고 이 방법이 좋은 것인가 의심들어서요.
안녕하세요. 파이썬 초보입니다.
1. DB에서 JOIN하여 VIEW를 만들어두고 백엔드에서 SELECT WHERE로 가져오기
2. 백엔드에서 1과 동일한 JOIN SELECT WHERE문을 실행
둘중 어느 것이 성능면에서 유리할까요?
현재 1처럼 사용 중인데 쿼리 변경이 유연하지 않고 이 방법이 좋은 것인가 의심들어서요.
유연하지 않다는건 예측 가능하다는 말과 동일하니 최적화는 더 쉽겠지요.
쿼리문 자체가 크고 복잡하다면
JOIN 대상을 줄이거나 SELECT 대상을 분할하여 연산을 스크립트(파이썬)에 맡기시는 것도 괜찮으실 듯 합니다.
번외로 파이썬의 경우 해외에서는 SQL을 그대로 쓰느냐, Pandas에 올려서 쓰느냐 설전도 많더라구요 ^^;
낮은 권한은 view까지만 접근하고 table접근 권한은 안준다. 제가 이해한게 맞나요?
미리 BACKGROUND에서 늘 JOIN 쿼리가 실행되고 있는 VIEW 테이블이니까,
그때그때 JOIN을 하고 다시 SELECT 하는 전체 쿼리하는 데 걸리는 시간에서 JOIN 시간이 빠지니까요.
그런데, 쿼리문의 속도는 늘 WHERE 이후의 조건이 결정을 짓습니다.
WHERE 문 뒤의 조건 범위가 넓을 수록 검색 범위가 넓어지기 때문에 그만큼 처리할 데이터가 늘고 속도는 느리게 됩니다.
특히, JOIN은 테이블 단위의 결합이기 때문에, WHERE 없는 전체 테이블 단위의 JOIN은 RECORD수 X RECORD수 만큼의 SELECT 대상이 생기는 것이기 때문에 엄청난 리소스를 잡아먹게 되고, 시간도 무한정 늘어납니다.
물론, INDEX 설정이 속도 개선에 엄청난 효과를 줍니다만, WHERE 대상이 되는 FIELD를 INDEX 잡아야 의미가 있죠.
보통, 초보분들이 하시는 게 일단, WHERE 없이 무조건 JOIN TABLE을 계층적으로 하고, 맨 마지막 단계에서 WHERE 조건을 기술하시는데, 각 테이블의 레코드 수가 적을 때에는 속도에 별 영향이 없지만, 각 테이블 레코드가 수백만 단위를 넘어가기 시작하면, 세월아 네월아 하게 됩니다.
이때 기본 테이블에 KEY나 INDEX가 적용되어야 속도가 빨라집니다.
VIEW는 실제 테이블이 아닌 가상 테이블로, 쿼리문으로 구성된 실행 명령으로 외부에서 VIEW를 호출하면 실행되기 때문에 VIEW 생성 쿼리가 어떻게 작성되는 가에 따라, 속도에서 이익을 볼 수도 있고, 손해를 볼 수도 있습니다.
따라서, VIEW보다는 차라리 JOIN 명령을 사용한 전체 쿼리를 필요할 때마다 호출하는 것이 나을 수도 있습니다.
참고로, INDEX나 KEY 설정은 해당 FIELD가 그럴 가치가 있는 잘 판단하셔야 합니다. 보기로 해당 FIELD의 값이 'Y'나 'N' 등 단일 값으로 모두 채워져 있다면, 의미도 없고 WHERE에 사용할 필요도 없습니다.