【问题标题】:Time optimization of large, filtered table for both read and write大型过滤表的读写时间优化
【发布时间】:2019-11-17 12:06:23
【问题描述】:

目前我正在开发一个与 JavaScript 框架前端和 SQL Server 数据库连接的大型 JAVA 应用程序。前端显示巨大的分页表格,包含 200 列各种类型和几百万行。此外,每一列都有自己的过滤器,就像在 Excel 的表格中一样。

用户需要快速读取、过滤和修改数据。我们的研究表明,瓶颈在于数据库查询——该表物理上位于 SQL Server 数据库中,并且没有索引。为过滤器的下拉列表获取行或可能值列表需要花费不可接受的时间。

我们曾考虑为每一列添加简单的默认索引,但它们会危及更新和添加行;不仅是用户,还有每天四次插入新的大量数据的 cron 作业。

我在这里而不是在 dba.stackexchange.com 上问,因为我怀疑克服这些困难的模式可能涉及 JAVA 应用程序,也许是 spring 中的某种缓存?

【问题讨论】:

标签: java sql sql-server optimization query-optimization


【解决方案1】:

kowalt,来自廉价座位的想法......

首先,Javascript 框架是否根据呈现的内容创建可过滤列表?意思是,它是从数据库中获取列过滤器的所有可能值,还是只是从该页面的 HTML 内容中抛出的内容?如果是后者,那么在没有通过应用程序回调数据库的情况下识别过滤框架的限制 - 因此 Javascript 性能是焦点(直到执行 sort-by 或 where-by 查询)。

其次,是否可以将演示数据源与跨国(x4/天)源分开?除了拖累跨国源之外,您可能有带有单独复制源的架构选项,用于在最可能的列上建立索引(例如优化一些,但不是全部)。索引的索引和刷新可以由数据库开发人员确定范围并作为(例如,每日)进程运行。

第三,可以从 Java 应用程序向 Javascript 提供必要的元数据,以便从单独的线程过滤下拉列表,尤其是在可能的条目范围不太可能发生显着变化的情况下。这可能有助于在客户端浏览器上尝试进行任何完整 (HTML) 表扫描。

Forth(低概率),也许探索在内存进程中运行数据库。如果基础设施不花钱,这可能是原始解决方案。

祝你好运。

【讨论】:

  • Javascript 不是罪魁祸首——正如您的第一个建议,它从数据库中获取列过滤器的所有可能值,并且生成的 SQL 查询在数据库上需要很长时间。
猜你喜欢
  • 2015-02-28
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多