ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] SQL VS CODE
    DB 2016. 10. 27. 09:59

    데이터베이스에 연결해서 어떤 결과를 처리하고자 할때 데이터베이스의 쿼리상에서 처리하는 것이 나을지, 코드상에서 처리하는 것이 나을지에 대한 이슈를 정리해보고자 합니다.

    SQL VS CODE

    데이터베이스와의 통신을 최소화하는 것이 좋습니다.

    • 코드에서 대부분의 작업을 진행한 다음에만 데이터베이스와 통신을 하는 것이 좋습니다. 그렇지 않으면 현재 진행하고 있는 작업에 대한 많은 자원이 필요하게 됩니다.

    쿼리의 복잡성을 최소화해야 합니다.

    • 데이터베이스와의 통신을 최소화하더라도, 이것은 지나치게 복잡하고 거대한 쿼리를 줄이는 작업을 의미하는 것이 아닙니다. 쿼리는 여전히 관리해야할 필요성이 있습니다. 만약 두 개의 단순한 쿼리가 하나의 거대한 쿼리를 개발하고 유지하는 골치를 덜 수있다면, 두 개의 단순한 쿼리를 거대한 한 개의 쿼리를 사용하는 것보다 좋습니다.

    code상의 list 반복문을 최소화해야 합니다.

    • 코드는 아주 좋습니다. 비지니스 로직을 넣기에 아주 좋은 장소이고 깔끔한 라이브러리들 또한 아주 많이 존재합니다. 이와 같은 이유로 코드는 굉장하지만 코드를 사용하는 것이 쿼리상에서 join이나 기타 다른 statement를 제거된 단순한 결과를 가지고 코드 상에서 반복문을 많이 사용한 작업을 의미한다면, 위와 반대로 코드를 최소화하고 쿼리를 향상시키는 것이 좋습니다.

    SQL CASE STATEMENT VS CODE IF STATEMENT

    흔히 거대한 쿼리의 SELECT절에 CASE문이 많아지면 이를 쿼리로 처리할지, CODE상에서 IF조건문으로 처리할지 햇갈립니다.


    만약 CASE문이 단지 query의 최종 출력을 변환하기 위해 사용되며, (만약 UI가 존재해서 코드상에서도 변경해도 결과가 같다고 하면), 데이터베이스 쿼리 / 프로시저가 처리하는 것을 코드에서 담당하는 것이 낫습니다. 여기서 명심해야 할 점은 성능 이슈보다 분리를 통해 문제가 발생할 수도 있습니다.

    아래와 같은 쿼리가 있습니다.

    SELECT InvoiceID, InvoiceDate,
        CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
    FROM ...

    이러한 쿼리는 UI 또는 레이어의 어디서든지 해당 값을 변경할 수 있습니다. 즉 쿼리자체에서 이러한 로직은 필요가 없습니다.


    반면 아래와 같은 CASE문은 꼭 필요한 경우입니다.

    SELECT
        SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
        SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
    FROM ...

    이러한 쿼리는 데이터베이스에서 처리하는 것이 더 낫습니다. 위의 CASE문은 의미가 존재하는 쿼리의 일부입니다. 이러한 논리를 괜히 코드에서 처리하도록 옮기는 것을 불필요합니다.


    SQL에서 처리할 지 CODE에서 처리할 지 결정은 아래와 같이 생각하며 진행해야 합니다.

    1. 해당 논리가 달성하고자 하는 것이 어디에 속해있는지를 파악해야 합니다.
    2. 실제로 상당한 성능 문제를 알아 차리는 경우, 성능 문제만 논의를 통해야 합니다.

    결론

    일반적으로 이러한 것들은 case by case입니다. 수명이 긴 어플리케이션의 경우 유지보수는 거대한 비용이여서 단순함을 추구하고자 위에서 설명한 내용들을 따를지도 모릅니다.

    댓글