我有一个ASP.net 2.0内部网站点,它使用文件夹及其内容的索引服务。 OLEDB用于通过使用与讨论here相同的技术查询此文件夹中的文件。 这是由另一位开发人员编写的,但我开始了解他的工作方式。
但是现在客户端抱怨页面的加载时间很长,因为文件夹中的所有文件都会立即被查询。他们是正确的,因为它很慢,所以我考虑使用分页(如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
答案 0 :(得分:2)
似乎MSIDXS不支持太多的SQL功能。 只有“选择”,“在哪里”,“排序依据”等基础知识才有效。 “Top”,“Rowcount”,“Over”等其他功能不起作用。它甚至在“Count(*)”上失败。
我使用带有2个整数的DataAdapter.Fill()方法实现了分页; startrecord和maxrecord。这不是理想的,但在这种情况下最好的解决方案。 现在将收集所有记录,但只有我需要的记录才会存储在数据集中,然后转换为我自己的类的集合。
这适用于第一页,因为只有第一行将被循环并返回。但是当你有20页时,最后一页需要更长的时间,因为它之前的所有记录都将被循环。
我测试了这个页面大小为20和400的结果。 第一页花了200毫秒,而最后一页花了大约1.6秒。 显着滞后但现在只发生在最后几页而不是前10页。 有一个搜索和排序机制,所以不会访问最后几页。