문제

저는 wpf destop 애플리케이션을 작성 중이며 SQL Server CE를 백엔드로 사용하고 싶습니다.효율적인 데이터 페이징을 수행하는 좋은 방법을 찾으려고 노력 중입니다.SQL Server Express에서는 다음과 같은 작업을 수행할 수 있습니다.

Select ID, FirstName, LastName
From (SELECT  ROW_NUMBER() OVER (ORDER BY ID)
 AS Row, ID, FirstName, LastName
 From TestTable                             
) 
WHERE  Row > 1 AND Row <= 10    

SQL Server CE에 비슷한 것이 있습니까?무엇이 지원되고 지원되지 않는지 완전히 모르겠습니다.데이터베이스에서 한 번에 10개의 행만 반환하고 싶고 모든 데이터를 가져온 다음 필터링하여 사용자에게 표시할 필요가 없습니다. 훨씬 느리기 때문입니다.감사해요.

도움이 되었습니까?

해결책

솔직히 아마도 가장 빠른 일은 sqlcedatareader .read () 10 번 전화하십시오. 그런 다음 사용자가 다음 페이지로 이동하면 이미 11 번째 결과를 가리키고 있으며 10 개를 더 읽을 수 있습니다. 뒤로 가야하는 경우 결과를 캐시하거나 sqlceresultset 지원합니다 추구합니다.

또한 SQLCEDATAREADER/결과는 경험에서 데스크탑의 데이터베이스와 상호 작용하는 가장 빠른 방법입니다. 데이터 세트/데이터 아래피터를 사용하는 것보다 말 그대로 100 배 빠를 수 있습니다.

다른 팁

누군가 가이 페이지에 도달하는 경우 답변을 찾고 있습니다 ... 나는이 게시물을 발견했습니다 : SQL Server CE 4.0의 페이징 쿼리 지원

http://beyondrelationalation.com/blogs/jacob/archive/2010/07/13/support-for-ping-queries-in-sql-server-ce-4-0.aspx

도움이 되었기를 바랍니다

또한 현재 지속성 메커니즘으로 SQL Server CE를 사용하는 WPF 응용 프로그램을 개발 중입니다.우리는 여러 개의(40개 이상의) 테이블을 가지고 있으며 그 중 일부는 꽤 큽니다(50,000개의 레코드, 적어도 내 기준으로는 큰 것입니다).

SQL CE에서 직접 데이터 페이징에 대한 조언은 다음과 같습니다.가능하면 피하세요!나는 Bob King이 설명한 접근 방식을 사용했는데, 적어도 나에게는 정말 끔찍한 유지 관리 악몽인 매우 추악한 코드가 탄생했습니다.

수만 개의 레코드를 페이징해야 하는 경우를 제외하고 가장 좋은 접근 방식은 다음을 사용하여 레코드를 모두 로드하는 것입니다. SqlCeDataReader 사용자 정의 클래스 컬렉션에 추가한 다음 메모리의 컬렉션을 페이지로 이동합니다.캐싱을 사용하더라도 매번 SQL 쿼리를 다시 실행하는 것보다 이 접근 방식이 응답성이 더 높다는 것을 알았습니다.내 경우에는 쿼리가 상당히 복잡했고 SqlCeDataReader 성능이 충분히 좋아서 성능 저하가 거의 눈에 띄지 않았습니다.첫 번째 일괄 로드 후 모든 페이지 변경이 거의 동시에 발생한다는 점은 말할 필요도 없습니다. 모든 것이 메모리에 보관되기 때문입니다.

내 사용자들의 일반적인 의견은 첫 번째 결과가 나타날 때까지 조금 더 기다려도 괜찮다는 것이었습니다. 그렇게 하면 나중에 페이징이 더 빨라질 것입니다.그리고 LINQ를 사용하면 Skip 및 Take 메서드를 호출하는 것만큼 페이징이 쉽습니다.Pager<T> 클래스 내부에 이 논리를 구현하여 매우 건조하고 훌륭하게 만들었습니다.

몇 가지 방법이 있지만 가장 단순한 방법은 다음과 같습니다.

가정합니다

  1. 페이지 크기 = 10
  2. 페이지 = 2

그 다음에

  1. 첫 번째 top = pagesize (10)
  2. 두 번째 top = pagesize * page (20)

SELECT
 [Page].[ID],
 [Page].[FirstName],
 [Page].[LastName]
FROM
(
SELECT TOP (10)
 [FirstRows].[ID],
 [FirstRows].[FirstName],
 [FirstRows].[LastName]
FROM
 (
 SELECT TOP (20)
  [TestTable].[ID],
  [TestTable].[FirstName],
  [TestTable].[LastName]
 FROM
  [TestTable]
 ORDER BY
  [TestTable].[ID] ASC
 ) AS [FirstRows]
ORDER BY 
 [FirstRows].[ID] DESC
) AS [Page]
ORDER BY
  [Page].[ID] ASC

SQL CE를 사용하여 Datagrid에 대한 사용자 정의 페이징을 구현했습니다. 위의 답변에서 논의 된대로 하위 쿼리를 사용하여 상단에서 상단을 사용하고 레코드를 건너 뛰는 방법을 구현했습니다. 그러나 소량의 데이터와 잘 작동합니다. 레코드가 수천에서 성장함에 따라 위의 방법론은 덜 도움이되고 성능이 느려집니다.

나는 내 기술을 사용하여 성능이 좋지 않은 문제를 해결했습니다. 내가 한 일은 각 페이지에서 변수의 첫 번째 및 마지막 레코드의 ID를 저장하는 것입니다.

dim firstRecord=dt.rows(0)("id")

그리고

dim lastRecord=dt.Rows(dt.rows.count-1)("id")

나는 그리드가 모든 페이지에 대해 binded 후에이 변수들을 초기화합니다.

사용자가 다음 버튼을 클릭하면 LastRecord보다 큰 데이터베이스에서 상단 (pagsize) 레코드를 가져 오십시오. 사용자가 이전 버튼을 클릭하면 FirstRecord보다 적은 데이터베이스에서 페이지를 가져옵니다. 또한이 경우 ID DESC로 주문합니다. DataGrid에 바인딩하기 전에 Dataview를 ASC에 사용하여 데이터를 재주문합니다.

그것은 내 페이징을 가장 효율적으로 만들었습니다. 레코드 케이스의 삽입 및 삭제를 위해 약간의 노력을 기울여야했지만. 그러나 나는 그것을 처리 할 수있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top