Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分析具有大量列的SQL Server表的最佳方法?_Sql_Sql Server_Large Data - Fatal编程技术网

分析具有大量列的SQL Server表的最佳方法?

分析具有大量列的SQL Server表的最佳方法?,sql,sql-server,large-data,Sql,Sql Server,Large Data,我有一个SQL Server表,有900多列和数亿行。我构建了一个存储过程,它一次捕获这些行的一小部分(通常在500k行以下),并查看每一列,以确定每个值的计数以及该列中该值的出现百分比。为此,我首先缩小数据范围并插入临时表。然后在temp表上运行分析 最近,我们需要对一组更大的数据进行分析,每次分析5000-1亿行数据。不幸的是,当我试图运行这个,它似乎永远运行。我怀疑向临时表中插入那么多数据是问题的一部分,但同时对每列中的所有值进行分组也需要很长时间 有没有更简单/更有效的方法?使用SQL

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

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


有没有更简单/更有效的方法?使用SQL Server 2012。

当内存不足时,您可能会遇到问题,因此它会开始使用交换。您可以监视HDD的使用情况,并查看这是否是使用ctrl+shift+esc的原因。如果是这样的话,那么你可以做循环。差不多

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:当处理这样的大量数据时,在循环中使用较小的数据块非常有帮助。它还通过避免大量查询来帮助减少瓶颈。您可能会发现您希望在循环中执行整个过程。比如,拉入500k行,进行处理,然后将需要的值写入临时表,例如每列的出现次数,以及到目前为止的总行数,以便获得百分比。继续建立这个临时表,然后在最后进行计算。