【问题标题】:Best way to analyze SQL Server table with a huge amount of columns?分析具有大量列的 SQL Server 表的最佳方法?
【发布时间】:2018-01-03 08:26:12
【问题描述】:

我有一个包含 900 多列和数亿行的 SQL Server 表。我构建了一个存储过程,它抓取这些行的一小部分(通常一次少于 500k 行)并查看每一列以确定获取每个值的计数以及该值在该列中出现的百分比。为此,我首先缩小数据范围并插入临时表。然后我在临时表上运行分析。

最近,我们需要一次对更大的数据组(50 到 1 亿行数据)进行这种分析。不幸的是,当我尝试运行它时,它似乎永远运行。我怀疑将这么多数据插入临时表是问题的一部分,但是对每一列中的所有值进行分组也需要很长时间。

有没有更简单/更有效的方法来做到这一点?使用 SQL Server 2012。

【问题讨论】:

  • 我认为执行计划在这里真的很有帮助。

标签: sql sql-server large-data


【解决方案1】:

当您没有足够的内存因此它开始使用交换时,您可能会遇到问题。您可以监控 HDD 的使用情况,看看是否是原因(为此使用 ctrl+shift+esc)。如果是这种情况,那么您可以执行 LOOP。类似的东西

DECLARE @max_id INT = (SELECT MAX(ID) FROM your_table),
    @checpoint INT = 500000,
    @current_id INT = 0,
    @step INT = 0;
WHILE (@current_id < @max_id)
BEGIN
   INSERT INTO #tmp   
   SELECT *
   FROM your_table
   WHERE id > @current_id and id < @current_id + @step * @checkpoint;
-- your analysis here
   SET @step += 1;
   SET @current_id = @current_id + @step * @checkpoint
END

我是在没有访问数据库的情况下编写的,所以可能会出现语法或逻辑错误,但我认为主要思想很清楚

【讨论】:

  • 致 OP:在处理这样的大量数据时,在循环中处理较小的块非常有帮助。它还通过避免大量查询来帮助减少瓶颈。您可能会发现您想让整个 proc 循环执行。比如,拉入 500k 行,进行处理,然后将所需的值写入临时表(例如,每列的出现次数,以及到目前为止的总行数,以便获得百分比) .继续建立这个临时表,然后在最后进行计算。
猜你喜欢
  • 2018-02-04
  • 2010-10-02
  • 2010-09-26
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多