我们目前在我们的网站上搜索,允许用户输入日期范围。该页面调用存储过程查询日期范围并返回适当的数据。但是,我们的很多表都包含30米到60米的行。如果用户输入了一年(或某个大范围)的日期范围,数据库将停止运行。
是否有任何解决方案不涉及对搜索进行时间限制?已经实现了分页以仅显示前500行,但数据库仍然受到重创。我们不能对返回的结果数量设置硬限制,因为用户“可能”需要所有结果。
答案 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)
不知道哪些是可能的
答案 5 :(得分:1)
听起来你真的不是在寻呼。我希望存储过程为页面取一个范围(您计算),然后只获取当前页面的那些行。假设数据不经常更改,这将减少数据库服务器上的负载。
答案 6 :(得分:0)
您的表数据如何在物理上构建,即分区,在文件组和磁盘存储等之间拆分?
您使用的是表格分区吗?如果不是,您应该考虑使用对齐分区。您可以按日期对数据进行分区,例如每年的分区。
在我要求跨越三年的查询的情况下,在多处理器系统上,我可以同时访问所有三个分区,从而提高查询性能。
答案 7 :(得分:0)
您是如何实现分页的?
我记得几年前我遇到过这样的问题,问题与我如何实现分页有关。然而,我所处理的数据并不像你那么大。
答案 8 :(得分:0)
并行化,并将其放入ram(或云端)。您会发现,一旦您想要同时访问大量数据,rdbms就成了问题而不是解决方案。没有人进行可视化使用rdbms。