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

时间:2011-10-14 13:40:23

标签: .net sql list listview view

这是我在这里的第一个问题,虽然我已经潜伏了很长一段时间。我想知道在产品数据库中搜索大约350,000条记录的最佳方法是什么。我正在重写一个当前搜索类似的应用程序:只要在搜索文本框中单击Enter,就会查询数据库并显示10条记录。然后,当您使用ListView控件中的向上和向下箭头浏览记录时,它将根据您的方向查询接下来的10条记录。看看其他问题,我找不到任何专门针对VS2010中的ListView执行此操作的问题。我已经对ListView的虚拟模式进行了一些研究,但是因为它一次只显示10条记录,所以正常的ListView会很好。 我目前能够显示10条记录,但是我一直在试图弄清楚如何跟踪和查询另外一条记录。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

汤姆,谢谢你的快速反应和详细的答复。我花了一些时间在周末尝试不同的方式来实现这一点,你的见解非常有帮助。 我决定做的是表单加载,加载匹配搜索的前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条记录,但如果需要,我会尝试。再次感谢您的帮助。