使用 .NET listview 高效搜索数十万条记录

Posted

技术标签:

【中文标题】使用 .NET listview 高效搜索数十万条记录【英文标题】:Efficiently searching hundreds of thousands of records with .NET listview 【发布时间】:2011-10-14 13:40:22 【问题描述】:

这是我在 SO 上的第一个问题,尽管我已经潜伏了很长时间。我想知道最好的方法是在产品数据库中搜索大约 350,000 条记录。我正在重写一个当前搜索如下内容的应用程序:只要您在搜索文本框中单击 Enter,就会查询数据库并显示 10 条记录。然后,当您使用 ListView 控件中的向上和向下箭头浏览记录时,它将根据您前进的方向查询接下来的 10 条记录。查看其他问题,我找不到任何专门解决在 VS2010 中使用 ListView 执行此操作的内容。我对 ListView 的 Virtual Mode 做了一些研究,但我想既然它一次只显示 10 条记录,那么普通的 ListView 就可以了。 我目前能够显示 10 条记录,但在试图弄清楚如何跟踪和查询另外一条记录时遇到了困难。

有没有人有这方面的经验或可能有一些建议?谢谢!

【问题讨论】:

公司目前使用的是SQL Server 2005。 【参考方案1】:

首先让我说我多年来没有做过很多前端编码,但 .NET 中肯定有一些缓存选项。处理 350K 行,我不知道这是否真的可行。

另一种选择是将缓存结果存储在具有用户或连接标识符的数据库中的一个(或多个表)中,以便您可以跟踪要使用的缓存结果。

第三个选项是简单地在前端存储您的排序列在列表中的最小值和最大值。然后,您可以将这些传递给下一个/上一个调用,并且数据库每次都可以查找相应的页面。这样做的一个缺点是,当人们更新数据库时,您可能无法获得一致的结果。例如,我可以点击“下一个”,有人可能会添加一个属于上一页范围的行,现在当我点击“上一个”时,我看到该行以及原始行中的九行而不是十行在那之前我一直在看。

现在谈谈我对前端搜索的强烈看法。您应该绝不允许用户翻阅 350K 行。无论如何,人类的大脑无法处理那么多事情。你真的认为用户会点击“下一步”按钮 35,000 次吗?要么要求他们输入将行限制在某个设定和合理数量的搜索条件,要么无论他们的搜索条件是什么,只允许他们去,例如 100 页。如果他们尝试转到第 101 页,则给他们一条消息,告诉他们限制搜索。这里的优点是您可以轻松使用任何缓存方法,并且结果足够有限,您不会在那里遇到资源问题。

我希望这对您有所帮助。如果您对上述任何模式有特定的问题,那么您可以在此处发布它们或专门为此创建一个新问题。

【讨论】:

【参考方案2】:

Tom,感谢您的快速回复和详细解答。周末我花了一些时间尝试不同的方法来实现这一点,您的见解非常有帮助。 我决定在表单加载时加载与搜索匹配的前 10 条记录。然后,如果他们确实滚动了(他们选择了页面上的最后一条记录并且按下的键是向下箭头),我再次使用类似于以下的 SQL 查询数据库:

SELECT TOP 1 Item, Description, BuyPrice, SellPrice FROM Product WHERE ID NOT IN (SELECT TOP <# of records received so far +1> ID FROM PRODUCT WHERE Description like '<search text>%' ORDER BY Description ASC) AND Description like '<search text>%' ORDER BY Description ASC

我知道这不是最有效的方法,但它工作得非常好,速度足够快,可以在生产中使用。我想您也可以选择接下来的 10 条记录,但如果需要,我会尝试。再次感谢您的帮助。

【讨论】:

以上是关于使用 .NET listview 高效搜索数十万条记录的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET,数据库N万条数据操作

制作listView高效率万能适配器

AV 引擎如何如此高效地搜索已知签名的文件?

CoreData 和大表

在 python 中高效处理约 5000 万条记录文件

c#中往mysql里批量插入上万条数据,有比较高效的方法吗