제가 조회하고 인서트하는 데이터가 하루 3만건이상입니다..
그래서 월단위로만 조회해도 100만건 정도됩니다
데이터 연동중인데.. 이 많은 데이터를 조회후 테이블에 인서트시켜야합니다.
본론으로 들어가서, 이글의 요점은
쿼리초보이기에 어떻게 쿼리를 짜야 좋은쿼리가 되는지.. 고수분들의 조언을 얻고싶습니다.
즉, 같은구문이라도 어떤것이 빠른지.. 알고싶습니다.
예를들면
group by vs distinct
where문에 isnull(@변수, '') = '' vs @변수 is null or @변수 = '' 의 등등..
같은 기능이라도 되도록이면 어떻게 쿼리를 짜면좋은것인지 팁좀 알려주시면감사하겠습니다. (__)
Comment 2
-
이리
2016.11.10 16:21
-
minsouk
2016.11.11 11:46
쿼리가 가장 중요하겠지만, 지금 질문하신 쿼리는 거의 같을 수 있구요 처리 방식을 잘 디자인 하는게 중요해 보입니다.
select * from tblx where c1 = @c1 등으로 일단 쿼리하시구요, row 단위로 ConcurrentQueue 에 데이터를 계속 넣고 있습니다. 이때 화면에 보여줘야 할 부분은 보여 주면 됩니다. 그리고, 다른 thread 로 ConcurrentQueue 에서 데이터를 2000개 단위로 빼 target 서버에 계속 bulk insert 를 합니다. 또 일정시간 텀을 가지고 데이터가 1개라도 남아 있으면 빼오게 합니다. 이 경우 메모리를 최소로 사용하면서 대용량 데이터를 빠르게 이동 할 수 있습니다. 한번 조회에 3만건 100만건은 많은게 아니라 pc spec 으로 처리 가능해보이는 수준 입니다. 주의할 점은 받은 데이터를 단순한 자료구조에 다 넣고 처리하겠다 라고 생각하시면 서버 메모리 부족으로 처리가 불가능 하므로, 데이터를 생산자와 소비자로 구분해 실시간 같이 처리가 될 수 있도록 만들어야 합니다. 그래서 ConcurrentQueue 같은게 필요하죠..
오픈소스를 이용 하고 일부 데이터가 소실 되어도 된다면, 카프카를 중간 저장소로 사용하고 hbase 를 Target 서버로 하면 더 좋을듯 합니다. 그런데, 이렇게 대용량 인프라를 꾸미면 또 이쪽 서버와 서비스를 관리하는 사람들이 필요하게 되지요.
case by case가 많기 때문에 실제 쿼리의 실행계획이나 프로파일러로 실제 실행 시간을 비교해 보시는게 좋을 듯 합니다.
참고로 where 조건의 좌변 가공은 index seek를 하지 못합니다.