【问题标题】:improve database querying in ms sql改进 ms sql 中的数据库查询
【发布时间】:2016-02-29 11:07:36
【问题描述】:

什么是查询大量数据的快速方法(在 10.000 - 100.000 之间,未来会变得更大......也许 1.000.000+)分布在多个表(20+)中,涉及左连接、函数(总和、最大值、计数等)?

我的解决方案是制作一个包含我需要的所有数据的表,并在其他表之一更新时使用触发器更新此表。我知道触发器并不是真的推荐,但这样我可以减轻查询的负担。或者每晚做一次大更新。 我也尝试过使用视图,但是一旦它开始涉及左连接和计算,它就会太慢并且超时。

【问题讨论】:

  • 你确定这是最好的设计吗?以我的经验,100.000 条记录并没有那么大。将所有内容放在一个表中会使数据非规范化,我(通常)不会这样做。
  • 它将达到百万大关,所以我也必须考虑这一点。这必须很快,因为一旦我查询了数据,我还需要使用它。因此,这就像导出几条 100.000 条记录,并且添加到过滤器中的每个连接或函数都会使其速度变慢。
  • 您能否澄清“在涉及左连接、函数的多个表 (20+) 中分布”?您是否必须运行一个查询来跨所有这些表执行连接?或者您是否有跨多个表的行分区?例如,其中包含历史数据的表格。

标签: sql-server performance large-data-volumes


【解决方案1】:

由于你的问题太笼统,所以这里是一个笼统的答案......

您现在采取的方法是优化单个查询/单个问题。当然,它可能解决你现在遇到的问题,但从长远来看通常不是很好(更不用说这种东西的累积维护成本了)。

常用的方法是创建一个“分析”数据库 - 您要查询所有报告的生产数据库的实时副本。这个分析数据库最终甚至可以是一个完整的 DWH,但您可能会从一个简单的实时复制(或每晚复制或其他)开始,然后从那里开始工作......

正如我所说,这个问题/问题太宽泛,无法用几段来回答,这些只是一些指导方针......

【讨论】:

  • DWH = 数据仓库?
【解决方案2】:

需要更多细节,但我已经可以建议了:

  1. 使用“with(nolock)”,这会稍微提高速度。

参考:Effect of NOLOCK hint in SELECT statements

  1. 为您的表字段使用索引以快速获取数据。

参考:sql query to select millions record very fast

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多