Пейджинг данных в SQL Server CE (Compact Edition) - PullRequest
12 голосов
/ 31 июля 2009

Я пишу приложение wtop-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 строк за раз из базы данных, и мне не нужно извлекать все данные и затем фильтровать их для отображения пользователю, поскольку это намного медленнее. Спасибо.

Ответы [ 5 ]

8 голосов
/ 26 января 2011

В случае, если кто-то заходит на эту страницу в поисках ответа ... Я сталкивался с этим сообщением: Поддержка Пейджинговых запросов в SQL Server CE 4.0

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

Надеюсь, это поможет

5 голосов
/ 04 ноября 2009

Я также в настоящее время работаю над приложением WPF, которое использует SQL Server CE в качестве механизма сохранения. У нас есть несколько (более 40) таблиц, и некоторые из них довольно большие (50 тыс. Записей, по крайней мере, по моим меркам).

Мой совет относительно подкачки данных непосредственно в SQL CE таков: избегайте, если можете! Я использовал подход, описанный Бобом Кингом, и по крайней мере для меня он привел к Очень Уродливому коду, реальному кошмару обслуживания.

Если вам не понадобится пролистывать десятки тысяч записей, я считаю, что лучший способ - загрузить их все, используя SqlCeDataReader , в коллекцию пользовательских классов, а затем пролистать коллекцию в памяти. Я обнаружил, что этот подход более отзывчив, чем повторное выполнение SQL-запроса каждый раз, даже с кэшированием. Случилось так, что в моем случае запросы были довольно сложными, и производительность SqlCeDataReader была достаточно хорошей, так что снижение производительности было практически незаметным. Нет необходимости указывать, что после первой пакетной загрузки каждое изменение страницы происходит практически мгновенно, поскольку все хранится в памяти.

Общее мнение моих пользователей состояло в том, что нормально дождаться появления первых результатов, если это впоследствии приведет к более быстрой подкачке страниц. А с помощью LINQ пейджинг так же прост, как и вызов методов Skip и Take. Я реализовал эту логику в классе Pager , сделав его очень СУХИМ и приятным.

2 голосов
/ 06 августа 2009

Честно говоря, наверное, самое быстрое, что нужно сделать, это использовать SqlCeDataReader и вызвать .Read () 10 раз. Затем, когда пользователь переходит на следующую страницу, вы уже указываете на 11-й результат и можете прочитать еще 10. Если вам нужно вернуться назад, вы можете либо кэшировать свои результаты, либо переключиться на SqlCeResultSet , который поддерживает поиск .

Кроме того, SqlCeDataReader / Result, по опыту, является абсолютно быстрым способом взаимодействия с базой данных на рабочем столе. Это может быть буквально в 100 раз быстрее, чем использование DataSets / DataAdapters.

1 голос
/ 13 апреля 2011

Я реализовал пользовательский пейджинг для сетки данных с использованием SQL CE. Я реализовал метод использования top в операторе select и пропуска записей, используя подзапрос, как обсуждалось в ответе выше. Но это хорошо работает с небольшим количеством данных. По мере того как количество записей возрастает до тысячи, вышеуказанная методология становится менее полезной и снижает производительность.

Я решил проблему с низкой производительностью, используя свою собственную технику. То, что я сделал, я храню идентификатор первой и последней записи на каждой странице в переменных.

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

и

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

Я инициализирую эти переменные после привязки сетки для каждой страницы.

Если пользователь нажимает кнопку «Далее», я получаю самые верхние (размер страницы) записи из базы данных, превышающей lastRecord. Если пользователь нажимает на предыдущую кнопку, я получаю верхние (PageSize) записи из базы данных меньше, чем firstRecord. Также я заказываю по Id desc в этом случае. И измените порядок данных, используя dataview для asc перед привязкой к сетке данных.

Это сделало мой пейджинг максимально эффективным. Хотя мне пришлось приложить дополнительные усилия для вставки и удаления записей дел. Но я смог справиться с этим.

1 голос
/ 23 октября 2010

Есть несколько способов, но самый простой способ будет выглядеть следующим образом:

Предполагая

  1. Размер страницы = 10
  2. Страница = 2

Тогда

  1. Первый ТОП = Размер страницы (10)
  2. Второй ТОП = Размер страницы * Страница (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
...