网络用户搜索太多数据

时间:2009-02-13 17:07:20

标签: sql sql-server database tsql stored-procedures

我们目前在我们的网站上搜索,允许用户输入日期范围。该页面调用存储过程查询日期范围并返回适当的数据。但是,我们的很多表都包含30米到60米的行。如果用户输入了一年(或某个大范围)的日期范围,数据库将停止运行。

是否有任何解决方案不涉及对搜索进行时间限制?已经实现了分页以仅显示前500行,但数据库仍然受到重创。我们不能对返回的结果数量设置硬限制,因为用户“可能”需要所有结果。

9 个答案:

答案 0 :(得分:4)

如果用户输入的日期范围很大,请让您的应用程序按小日期范围步骤进行搜索。可能使用慢启动方法:首先搜索限制为,例如一个月范围,如果它返回少于500行,则搜索前两个月直到您有500行。

您将希望从最近的日期开始按降序排列,并使用最早的日期进行升序排序。

答案 1 :(得分:3)

听起来我觉得这是设计而不是技术问题。没有人需要动态数百万的数据记录。

你将不得不问自己一些难题:是否有另一种方式来获取人们的数据而不是网络?有没有更好的方法可以要求过滤?用户需要这些信息究竟是什么?有没有办法提供这种级别的报告而不是喷出一切?

重新评估用户想要和需要的内容。

答案 2 :(得分:2)

  

我们不能严格限制   因为返回的结果数量   用户“可能”需要所有这些。

您似乎在说,由于业务原因,您无法阻止用户请求大型数据集。我无法看到任何技术方法。

答案 3 :(得分:2)

索引日期字段并强制查询使用该索引:

CREATE INDEX ix_mytable_mydate ON mytable (mydate)
SELECT TOP 100 *
FROM mytable WITH (INDEX ix_mytable_mydate) 
WHERE mydate BETWEEN @start and @end

似乎优化程序在看到大范围时会选择FULL TABLE SCAN

您能否发布您使用的查询和该查询的执行计划?

答案 4 :(得分:1)

不知道哪些是可能的

  1. 使用搜索引擎而不是数据库?
  2. 不允许进行非常一般的搜索
  3. 缓存热门搜索结果
  4. 将数据库分解为单独服务器上的分片,并将结果合并到您的应用程序中。
  5. 在内部执行具有较小日期范围的多个查询

答案 5 :(得分:1)

听起来你真的不是在寻呼。我希望存储过程为页面取一个范围(您计算),然后只获取当前页面的那些行。假设数据不经常更改,这将减少数据库服务器上的负载。

答案 6 :(得分:0)

您的表数据如何在物理上构建,即分区,在文件组和磁盘存储等之间拆分?

您使用的是表格分区吗?如果不是,您应该考虑使用对齐分区。您可以按日期对数据进行分区,例如每年的分区。

在我要求跨越三年的查询的情况下,在多处理器系统上,我可以同时访问所有三个分区,从而提高查询性能。

答案 7 :(得分:0)

您是如何实现分页的?

我记得几年前我遇到过这样的问题,问题与我如何实现分页有关。然而,我所处理的数据并不像你那么大。

答案 8 :(得分:0)

并行化,并将其放入ram(或云端)。您会发现,一旦您想要同时访问大量数据,rdbms就成了问题而不是解决方案。没有人进行可视化使用rdbms。