我有一个包含900多列和数亿行的SQL Server表。我构建了一个存储过程,它抓取这些行的一小部分(通常一次不超过500k行)并查看每一列以确定获取每个值的计数以及该列中该值的出现百分比。我首先缩小数据并插入临时表。然后我在临时表上运行分析。
最近,我们需要一次对更大的数据组(5亿到1亿行数据)进行分析。不幸的是,当我尝试运行它时,它似乎永远运行。我怀疑将大量数据插入临时表是问题的一部分,但是然后对每列中的所有值进行分组也需要很长时间。
有更简单/更有效的方法吗?使用SQL Server 2012。
答案 0 :(得分:1)
如果内存不足,可能会遇到问题,因此开始使用swap。您可以监视硬盘使用情况并查看是否是原因(使用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
我在没有访问数据库的情况下编写了它,因此可能存在语法或逻辑错误,但我认为主要思路非常明确