복붙노트

[SQL] 서버 나 클라이언트에 정렬?

SQL

서버 나 클라이언트에 정렬?

나는 직장에서 동료와 토론을했다, 그것은 SQL 쿼리 및 정렬에 대해이었다. 그는 당신이 서버가 클라이언트에 행을 반환하기 전에 정렬을 수행하도록해야한다는 의견을 가지고있다. 반면에 나는 그대로 서버가 바쁜만큼 아마이라고 생각하고, 성능이 가져온 행이 후 클라이언트 핸들을 정렬하게하는 것이 더 나은해야합니다.

어떤 전략 사람은 다중 사용자 시스템의 전체 성능에 가장 적합합니다?

해결법

  1. ==============================

    1.일반적으로, 데이터베이스가 정렬을 할 수 있도록해야한다 효과적으로이 문제를 처리 할 수있는 자원이없는 경우, 당신은 당신의 데이터베이스 서버를 업그레이드해야합니다.

    일반적으로, 데이터베이스가 정렬을 할 수 있도록해야한다 효과적으로이 문제를 처리 할 수있는 자원이없는 경우, 당신은 당신의 데이터베이스 서버를 업그레이드해야합니다.

    이 정렬 된 순서로 데이터를 검색하기 위해 우선, 데이터베이스가 이미 사소한 될 수 있도록 할 필드에 인덱스가있을 수 있습니다. 둘째, 클라이언트는 그들 모두 가질 때까지 결과를 정렬 할 수 없습니다; 서버가 결과를 정렬하는 경우, 한 번에 하나씩 행을 처리 할 수있는, 이미 정렬. 마지막으로, 데이터베이스는 클라이언트 시스템에 비해 아마 더 강력하고 아마도 더 효율적으로 정렬을 수행 할 수 있습니다.

  2. ==============================

    2.그것은 거기 페이징이 포함되어 ... 달려있다? 데이터 세트의 최대 크기는 무엇입니까? 전체 데이터 세트의 필요가 모두 같은 하나의 방법으로 시간을 정렬 할 수 있나요? 또는 사용자 선택에 따라? (페이징 참여의 경우) 또는, 그것은 클라이언트 화면 필요성에 한 페이지 만 기록입니다 소트? 새로 소트 세트의 (일반적으로 허용되지 않음) 또는 전체 데이터 세트 필요가 정렬 될 않으며, 1 페이지가 다시 표시?

    그것은 거기 페이징이 포함되어 ... 달려있다? 데이터 세트의 최대 크기는 무엇입니까? 전체 데이터 세트의 필요가 모두 같은 하나의 방법으로 시간을 정렬 할 수 있나요? 또는 사용자 선택에 따라? (페이징 참여의 경우) 또는, 그것은 클라이언트 화면 필요성에 한 페이지 만 기록입니다 소트? 새로 소트 세트의 (일반적으로 허용되지 않음) 또는 전체 데이터 세트 필요가 정렬 될 않으며, 1 페이지가 다시 표시?

    이 정렬 작업의 처리 요구 사항에 비해 클라이언트 하드웨어의 분포는 무엇입니까?

    결론은; 그것은 전반적인 사용자 경험 (물론 비용에 대해 측정), 즉 일반적으로 클라이언트 컴퓨터가 느린 서버보다에서 ... 당신의 결정을 통제해야하고, 추가 지연이 발생할 수 있습니다. ... ...하지만 클라이언트가 초기 페이지로드 후에 추가로 사용자 지정 정렬 작업을 요청합니다 얼마나 자주? (이미 클라이언트에있는 데이터의 클라이언트 종류 ... 빠른 방법은 왕복보다) 그러나 클라이언트에서 정렬 항상 전체 데이터 세트가 지연 이니셜 페이지 게으른 로딩을 요구할 수있다 표시 .. 또는 AJAX, 또는 다른 기술적 복잡성이 완화 그건 ... 초기로드에 클라이언트로 전송해야합니다 ...

    서버 OTOH, 소개하고 추가 확장 성 문제에 정렬하고 DB에 정렬하고 있다면 ... 당신이 추가로드를 처리하는 서버 팜에 더 많은 상자를 추가 할 것을 요구하고 복잡 할 수있는 임계 값에 도달 할 수있다. (DB에 수평 확장하기 위해, 당신은 단지 데이터를 읽고 몇 가지 읽기 전용 복제 방식, 또는 공유에 여러 서버 (각 일을 처리 할 수있게됩니다 다른 솔루션)를 구현해야한다) ..

  3. ==============================

    3.나는 로버츠의 대답에 찬성입니다,하지만 난 그것에 조금을 추가하고 싶었다.

    나는 로버츠의 대답에 찬성입니다,하지만 난 그것에 조금을 추가하고 싶었다.

    나는 또한 SQL 서버의 데이터 정렬 선호, 내가 클라이언트 측에서 우리가 가지고있는 거의 모든 경우에 그것을 시도 많은 시스템에서 일한가 SQL 서버 내부에서 수행 한하는 과정을 다시 작성합니다. 왜 요청할 수도가 무엇입니까? 그런데 우리는 두 가지 주요 이유가있다.

    우리는 사용자에게 데이터의 매우 큰 세트를 보여 인터페이스를 처리하고, 정렬 및 페이징이 훨씬 더 그것을 클라이언트 측하는 것보다 수행하는 것입니다 처리하기 위해 SQL 서버의 전원을 활용.

    여기에 몇 가지 숫자를 넣어하기 위해, SQL 서버 측 종류의 종류의 우리의 환경에서 클라이언트 측에, 하나를위한 페이징. 정렬을 위해 XML을 사용하여 28초 클라이언트 측 및 서버 측 종류의 총로드 시간 삼초.

  4. ==============================

    4.일반적으로 그 서버 측 정렬 위에 표현 된 의견은 일반적으로 갈 수있는 방법에 동의합니다. 그러나, 클라이언트 측 정렬을 할 수 때로는 이유가 있습니다 :

    일반적으로 그 서버 측 정렬 위에 표현 된 의견은 일반적으로 갈 수있는 방법에 동의합니다. 그러나, 클라이언트 측 정렬을 할 수 때로는 이유가 있습니다 :

    기억해야 할 중요한 것은 강력한 클라이언트와 서버 간의로드 밸런싱 이론에서 좋은 아이디어가 될 수 있지만, 단지 서버가 모든 삽입에 업데이트되는 인덱스를 유지 관리 할 수 ​​있다는 것입니다. 클라이언트가하는 무엇이든간에, 그것은 데이터의 인덱싱되지 않은 분류되지 않은 세트로 시작하고있다.

  5. ==============================

    5.평소와 같이, "그것은 의존한다":)

    평소와 같이, "그것은 의존한다":)

    저장 프로 시저가있는 경우, 예를 들어, 그 (보고서, 그리드 등 여부), 아마 당신이 이동하는 방법은 중요하지 않습니다 프리젠 테이션 레이어에 결과를 전송한다.

    나는 일반적에서 실행 무엇하지만, (그들은이 보고서를 직접 사용 되었기 때문에, 예를 들어) 정렬 한뿐만 아니라 자신의 분류와 다른 뷰 또는 다른 절차에서 사용하는 도면이다.

    그래서 일반적으로, 나는 그것이 합리적인 정당성이있을 때 클라이언트 측과 서버에서만 모든 정렬을 수행하기 위해 다른 사람을 격려한다.

  6. ==============================

    6.정렬 그냥 화장품과 클라이언트가 전체 데이터 세트를 얻는 경우 나는 프레젠테이션에 대해 같이 클라이언트 핸들을이를 수 있도록하는 경향이있다.

    정렬 그냥 화장품과 클라이언트가 전체 데이터 세트를 얻는 경우 나는 프레젠테이션에 대해 같이 클라이언트 핸들을이를 수 있도록하는 경향이있다.

    또한, 그리드 말, 당신은 열 머리글을 클릭하여 순서를 변경할 수있는 사용자로 어쨌든 클라이언트에서 정렬을 구현 할 수 있습니다 (다시 모든 정보를 검색 할 서버를 부탁하고 싶지 않아요)

  7. ==============================

    7.다른 성능 관련 문제와 마찬가지로 보편적 인 대답은 ... "상황에 따라 다르다." 그러나, 나는 클라이언트에서 정렬에 대한 선호를 개발했다. 우리는 브라우저 기반의 애플리케이션을 작성하고, 클라이언트의 나의 정의는 웹 서버 실제 최종 사용자 클라이언트 브라우저 사이의 분할이다. 나는 DB의 정렬에 클라이언트에서 정렬 선호하는 두 가지 이유가 있습니다.

    다른 성능 관련 문제와 마찬가지로 보편적 인 대답은 ... "상황에 따라 다르다." 그러나, 나는 클라이언트에서 정렬에 대한 선호를 개발했다. 우리는 브라우저 기반의 애플리케이션을 작성하고, 클라이언트의 나의 정의는 웹 서버 실제 최종 사용자 클라이언트 브라우저 사이의 분할이다. 나는 DB의 정렬에 클라이언트에서 정렬 선호하는 두 가지 이유가 있습니다.

    첫째,보기의 설계 점에서 그것을 할 수있는 "권리"장소의 문제가있다. 내가 프리젠 테이션의 함수로 볼 수 있도록 시간 데이터의 순서의 대부분은 비즈니스 규칙 것은 오히려 최종 사용자 편의 일이 아니다, 나는 데이터베이스에 푸시 프리젠 테이션 문제 좋아하지 않는다. 항목의 현재 가격이 파일에 대한 가장 최근의 예를, 예외가있다. 당신은 같은과 가격을 얻는 경우 :

    SELECT TOP 1 price 
    FROM itemprice 
    WHERE ItemNumber = ? 
       AND effectivedate <= getdate() 
    ORDER BY effectivedate DESC
    

    그런 다음 행의 순서는 매우 비즈니스 규칙의 일부이며 분명히 데이터베이스에 속한다. 그러나 성에서 정렬하는 경우 FIRSTNAME에 다시 사용자 뷰의 성으로 고객, 그들이 FIRSTNAME 열 머리글을 클릭하고 다시 국가에 그들이 그 헤더를 클릭 할 때 때 때 다음 정렬 프레젠테이션의 함수이며, 프레젠테이션 계층에 속한다.

    나는 클라이언트 계층에 정렬 선호하는 두 번째 이유는 성능 중 하나입니다. 웹 서버 나 사용자와 내 웹 서버에 과부하 경우입니다, 내가 다른, 다른, 다른를 추가 할 수 있습니다, 수평 확장 할 수 있습니다. 내가 부하를 처리 할 필요가 모든 것이 잘 작동하기 때문에 나는 많은 프런트 엔드 서버로 사용할 수 있습니다. 나는 데이터베이스에 과부하 경우에, 나는 망하고있다. 제가 DB를 수 있도록 같은 데이터베이스가 확실 문제에 더 많은 하드웨어를 던질 수, 수직 확장,하지만 비용 금지된다 어떤 점에서, 그래서 어떻게해야하는 선택을 수행하고, 클라이언트가 정렬하자, 어떤 그것은 아주 간단히 할 수 있습니다.

  8. ==============================

    8.나는 정의 그러나 나는 또한 대부분의 SQL 문은 기본적으로 BY 절 몇 가지 합리적인 ORDER를 가져야한다고 제안 클라이언트에서 정렬을 선호합니다. 이 데이터베이스에 거의 영향을 미치지 만하지 않고 나중에 문제와 바람 수 있습니다. 종종 이제까지 그것을 실현하지 않고 시간, 개발자 나 사용자가 몇 가지 초기 기본 정렬 순서에 의존하기 시작합니다. ORDER BY 절을 지정하지 않은 경우, 데이터는 유일한 기회로 순서입니다. 일부 나중에 인덱스는 변경 될 수 있습니다 또는 데이터를 다시 구성 할 수 있으며 데이터의 초기 주문이 그들 아래에서 밖으로 변경되었을 수 있기 때문에 사용자들은 불평 할 것이다.

    나는 정의 그러나 나는 또한 대부분의 SQL 문은 기본적으로 BY 절 몇 가지 합리적인 ORDER를 가져야한다고 제안 클라이언트에서 정렬을 선호합니다. 이 데이터베이스에 거의 영향을 미치지 만하지 않고 나중에 문제와 바람 수 있습니다. 종종 이제까지 그것을 실현하지 않고 시간, 개발자 나 사용자가 몇 가지 초기 기본 정렬 순서에 의존하기 시작합니다. ORDER BY 절을 지정하지 않은 경우, 데이터는 유일한 기회로 순서입니다. 일부 나중에 인덱스는 변경 될 수 있습니다 또는 데이터를 다시 구성 할 수 있으며 데이터의 초기 주문이 그들 아래에서 밖으로 변경되었을 수 있기 때문에 사용자들은 불평 할 것이다.

  9. ==============================

    9.상황은 변화하고, 성능을 측정하는 것이 중요합니다.

    상황은 변화하고, 성능을 측정하는 것이 중요합니다.

    때때로 그것은 명백하다 - 당신은 큰 데이터 세트를하고 정렬 된 목록 (사용자 인터페이스 응용 프로그램에서 예를 들어, 페이징)의 작은 범위에 관심이 있다면 - 서버에서 정렬하면 데이터 전송을 저장합니다.

    그러나 자주 클라이언트가 대기하는 동안 하나의 DB 및 여러 클라이언트, 그리고 DB에 과부하가 될 수 있습니다. 클라이언트에서 정렬하면 무거운 아니며,이 상황에서 당신이 확장 도울 수있다.

  10. ==============================

    10.서버에 작업을 수행합니다.

    서버에 작업을 수행합니다.

    데이터 세트가 큰 경우 서버가 훨씬 더 나은 다음에 클라이언트를 다룰 것이다. 현대 데이터베이스 서버는 강력한 인덱스 캐시의 구조와 겸손 브라우저 또는 클라이언트 응용 프로그램 그나마 가지고 구체화를

    데이터 세트가 작은 경우는 클라이언트 나 서버에 그 일을 어떤 성능이나 자원 사용에 미치는 영향이 없습니다.

    이 고려 클라이언트 응용 프로그램의 모든 잘 설계되고 클라이언트가 말할 때처럼 (클라이언트에서 정렬 및 정렬 매개 변수 변경을 할 경우 '우, 지금은이 주요 재스퍼 리포트를 할 때 당신은 시나리오에있을 수없는 당신이 참조에 (23 개) 다른 매개 변수 (356 개) 다른 장소는 이제 성 대신 '생년월일에 의해 정렬

  11. from https://stackoverflow.com/questions/326634/sorting-on-the-server-or-on-the-client by cc-by-sa and MIT license