1

背景:

我在 Windows 2008 上使用 SQL Server 2008 和 ASP.NET 4

我有一张表,其中包含大约 1000 万行产品,我在线提供给用户浏览而不是搜索。1000 万种产品中的每一种都有额外的属性——比如类别——我保存在查找表中——有三个或四个查找表。

问题

当有人浏览并开始使用过滤器(发货地点、价格、质量、品牌)时,我需要加入表格,应用所有过滤器并返回结果。它非常慢,我想让它更快。有时用户会应用一个非常广泛的过滤器,产生 800,000 个结果,虽然我只返回前 10 个用于浏览,但我仍然需要运行完整的 800,000 个查询。

我已经尝试过的

我已将各个表中的所有信息合并到一个物理表中,然后为该表创建了一个覆盖索引。

查询要快得多,但是我必须在幕后的工作台上进行大量维护工作,以确保如果有东西缺货,我会在合理的时间范围内(5 分钟左右)将其取出.

我不使用物化/索引视图 b/c 我在 SQL Server 似乎不喜欢的结果中有聚合。

问题

除了我已经完成的索引和表优化之外,如何加快浏览结果的速度?我没有进行任何全文搜索——我正在使用确切的参数进行过滤。

我想到的可能的解决方案

大型缓存解决方案——AppFabric 或 MemCached。我对这些几乎一无所知,也不知道它们是否合适。

小型缓存解决方案——也许利用 ASP.NET 缓存——但每个人都会应用不同的过滤器,所以我不确定这会给我带来多少。

SSD——作为一种更大规模的解决方案,我曾考虑过购买 SSD,但这将在路上

CDN——我不认为 CDN 会帮助 b/c 这里的瓶颈是我的数据库的搜索能力,而不是到请求者的带宽/距离。

4

2 回答 2

1

我在复杂的连接查询中遇到了类似的问题,导致可怕的响应时间。我能够通过使用 Lucene.NET 来解决它。它是 Lucene 搜索索引的 .NET 实现。基本上,您在数据字段(您的类别)上建立索引,然后您可以通过这些类别进行搜索并非常快速地返回数千行。基本上,它将连接操作排除在等式之外,因为它已经通过索引知道哪些记录符合您的标准。

下面是一篇关于Lucene.NET的非常好的文章。我强烈推荐它。使用标准联接需要 20 秒的搜索结果,并将响应时间减少到不到一秒。

http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net

此外,如果您有特定的 Lucene.NET 实施问题,请随时联系我。为了在我的网站上正确实施它,我刚刚完成了大量研究/学习,所以如果您对如何使其工作有具体问题,我也可以提供帮助。

于 2013-07-05T15:11:51.497 回答
0

“我执行完整查询 b/c 我需要填充新过滤器和结果数量以及搜索结果。例如,如果有人过滤“鞋子”类别和 TX 位置,其他一些过滤器将根据之前的过滤器受到限制。”

尝试执行两个查询:一个计算所有结果,一个选择前 N 个。也许您的瓶颈是将 800,000 行复制到客户端。执行两个查询会以额外查询为代价来解决此问题。尽管由于对少数行和仅计数查询的优化,成本可能低于 2 倍。

于 2013-07-06T11:37:34.070 回答