효과적인 방법으로 페이징을 구현하는 방법은 무엇입니까?


9

큰 결과 집합을 초래할 수있는 데이터베이스 쿼리가 있습니다. 데이터를 표시하는 클라이언트는 네트워크를 통해 데이터를 수신하므로 데이터베이스에서 처음 50 개의 결과 만 검색하여 클라이언트로 전송하여 전송 된 데이터의 양을 최소화하는 것이 었습니다. 그런 다음 두 번째 페이지로 이동하여 다음 50 가지 결과 등을 검색 할 수 있습니다 (예 : Google이 제공하는 것과 비슷한 것)

문제는 페이징을 효과적으로 구현하는 방법입니다. mssql이 가능한 한 많이 캐시를 사용하고 페이징을 변경할 때마다 동일한 캐시가 다시 한 번 실행되지 않도록하고 싶습니다.

데이터베이스를 동시에 쿼리하는 클라이언트가 더 있습니다. 사용 된 SQL 엔진 : MS SQL 2005

내 아이디어는 :

  • 준비된 SQL Statemenst를 사용하여 실행 계획 공유를 보장하십시오.
  • ROW_COUNT 변수를 사용하여 필요한 행만 검색하십시오.

그러나 이것이 가장 효과적인 방법입니까? 또는 전체 결과 세트를 검색하고 데이터를 클라이언트로 전송하는 코드에서 페이징을 구현하는 것이 더 낫다고 생각합니까?

팁 주셔서 감사합니다!

안부, 토마스

답변:


7

쿼리는 매번 실행됩니다. SQL Server는 결과를 캐시하지 않습니다.

SQL Server 2011까지는 적절한 페이징이 구현되지 않지만 확인한대로 옵션은 다음과 같습니다.

  • ROW_NUMBER () 및 요청시 쿼리
  • 클라이언트 캐싱

준비된 SQL 문도 매번 실행됩니다.

팻 클라이언트가있는 경우 캐싱은 클라이언트에 로컬입니다. 예를 들어 수백만의 얼룩이 없으면 대부분 괜찮습니다.

웹 클라이언트에서는 모든 결과를 렌더링하지만 상위 100 개만 표시하고 행 101+가있는 숨겨진 DIV를 확장하는 것보다 "모두 표시"버튼이 있습니다. 우리는 웹 서버에 캐시하지 않으며 페이징을 제공하지 않습니다.


감사. 사용자가 정렬 기준을 변경하면 더 좋은 방법은 무엇입니까? 새로운 기준으로 쿼리를 한 번 더 실행하거나 클라이언트에서 결과를 정렬해야합니까?
Tomas Walek

1
나는 클라이언트에서 정렬합니다. 데이터가 이미 있습니다. 예, 데이터베이스는 정렬에 능숙하지만 데이터가 동일하고 사용 가능한 경우 다른 호출을하는 이유는 무엇입니까? 브라우저에서 정렬 할 수 있도록 jQuery 애드온을 사용합니다 :-)
gbn

4

환경에 따라 다릅니다. 두 방법을 모두 사용하여 테스트를 설정하고 가장 적합한 방법을 확인합니다. 개인적으로, 나는 서버에서 페이지를 열 것입니다. 유선 데이터가 적고 클라이언트 RAM의 데이터가 적을수록 좋습니다. 클라이언트 시스템 사양을 제어 할 수있는 경우 모든 트래픽이 불포화 LAN을 통해 이루어지고 클라이언트는 항상 여러 페이지를 신속하게 페이징 한 다음 클라이언트에서 페이징 할 수 있습니다.


감사. 실제로는 둘 다 필요합니다. 서버와 클라이언트 간의 통신은 WCF에서 구현되므로 메시지의 최대 크기가 있으며 결과 집합이이 크기를 초과하면 전체 데이터를 클라이언트로 전송하기 위해 더 많은 메시지를 보내야합니다. 고객은 또한 여러 페이지를 빠르게 페이지로 넘기는 것을 좋아합니다 ... :(
Tomas Walek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.