1

我有一个 ASP.net 2.0 Intranet 站点,它在文件夹及其内容上使用索引服务。OLEDB 用于通过使用此处讨论的相同技术来查询此文件夹中的文件。这是由另一位开发人员编写的,但我开始了解他的工作方式。

但是现在客户抱怨页面加载时间长,因为文件夹中的所有文件都被一次查询。他们对它很慢的事实是正确的,所以我考虑使用分页(就像在 linq Skip().Take() 中一样)。我知道在 SQL 中这翻译为:

SELECT col1, col2 
FROM 
(
   SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
   FROM MyTable
)
AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow

但由于某种原因,这在与 OLEDB 一起使用时不起作用。这使用了哪个版本的 SQL,或者你们有没有关于如何实现分页的建议?

编辑:因为上述方法仅在使用 sql Server 2005 或更高版本时可用,所以我将尝试 2005 年之前的方法。我认为 OLEDB 不支持 Row_Number() 或 Over。打算试试:

SELECT ... FROM Table WHERE PK IN 
  (SELECT TOP @PageSize PK FROM Table WHERE PK NOT IN
    (SELECT TOP @StartRow PK FROM Table ORDER BY SortColumn)
   ORDER BY SortColumn)
ORDER BY SortColumn
4

1 回答 1

2

似乎 MSIDXS 不支持太多 SQL 函数。只有“选择”、“位置”、“排序依据”等基础知识才有效。“Top”、“Rowcount”、“Over”等其他功能不起作用。它甚至在“计数(*)”上失败。

我使用带有 2 个整数的 DataAdapter.Fill() 方法实现了分页;开始记录和最大记录。这并不理想,但在这种情况下是最好的解决方案。现在将收集所有记录,但只有我需要的那些将存储在数据集中,然后将其转换为我自己的类的集合。

这适用于第一页,因为只有第一行会被循环和返回。但是当你有 20 页时,最后一页会花费更长的时间,因为它之前的所有记录都会被循环。

我用 20 和 400 个结果的页面大小对此进行了测试。第一页花费了 200 毫秒,而最后一页花费了大约 1.6 秒。一个明显的滞后,但现在它只发生在最后一页而不是前 10 页。有一个搜索和排序机制,所以最后一页不会被访问那么多。

于 2012-08-30T09:21:23.140 回答