【问题标题】:Web users searching for too much data搜索过多数据的网络用户
【发布时间】:2023-03-20 15:34:02
【问题描述】:

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

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

【问题讨论】:

  • “仅显示前 500 个”不是硬限制吗?
  • 日期有哪些索引?
  • 是在数据库级别实现分页,还是在查询 60m 行然后只显示 500 行?
  • 创建索引,缩小限制,每页分页 20-30 个结果。
  • 分页在数据库级别实现以显示前 500 个结果。我们有一个 DBA 已经完成并创建了索引。

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


【解决方案1】:

如果用户输入的日期范围过大,请让您的应用程序以较小的日期范围步骤进行搜索。可能使用慢启动方法:第一次搜索仅限于一个月范围,如果返回少于 500 行,则搜索前两个月,直到有 500 行。

您需要从最近的日期开始降序排列,从最旧的日期开始升序排列。

【讨论】:

    【解决方案2】:

    在我看来,这是一个设计问题,而不是技术问题。没有人需要动态的数百万条数据记录。

    您将不得不问自己一些棘手的问题:除了网络之外,还有其他方法可以让人们获取数据吗?有没有更好的方法可以要求过滤?用户需要这些信息究竟是为了什么?有没有一种方法可以提供这种级别的报告,而不是把所有东西都吐出来?

    重新评估用户想要和需要的是什么。

    【讨论】:

    • 当然有。但是,您在交付它们时会遇到问题。看看数据仓库在做什么。我可以在屏幕上放置 1920*1200 像素的图像。这可以代表 200 万条记录。
    • 如果它是即时的,人们通常想要某种分类或总结。如果它不那么频繁/更多安排,那么查询时间就不再是一个问题。他们的用户似乎不太可能即时需要那么多数据。也许他们更喜欢每日报告。
    【解决方案3】:

    我们不能对 返回的结果数,因为 用户“可能”需要所有这些。

    您似乎是在说您不能阻止用户出于业务原因请求大型数据集。我看不出任何技术性的方法。

    【讨论】:

      【解决方案4】:

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

      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

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

      【讨论】:

      • 我同意,执行计划会说明很多 - 并且还提供基线以查看更改是否会产生改进。我总是非常不愿意通过索引提示强制使用索引 - 当 SQL 不使用索引时,我希望它值得调查
      【解决方案5】:

      不知道哪些是可能的

      1. 使用搜索引擎而不是数据库?
      2. 不允许非常笼统的搜索
      3. 缓存热门搜索结果
      4. 将数据库分成不同服务器上的分片,在您的应用程序中组合结果。
      5. 在内部执行多个较小日期范围的查询

      【讨论】:

        【解决方案6】:

        听起来你真的没有分页。我会让存储过程为页面获取一个范围(您计算出的),然后只获取当前页面的那些行。假设数据不经常变化,这样可以减少数据库服务器的负载。

        【讨论】:

          【解决方案7】:

          您的表数据的物理结构如何,即分区、跨文件组和磁盘存储等分割?

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

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

          【讨论】:

            【解决方案8】:

            你是如何实现分页的?

            我记得几年前我遇到过这样的问题,问题与我如何实现分页有关。但是我处理的数据没有你的大。

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-17
                • 2022-01-16
                • 2011-10-12
                • 1970-01-01
                • 2019-10-16
                • 2023-03-30
                • 1970-01-01
                相关资源
                最近更新 更多