红移查询:错误xx000磁盘已满红移

3

我执行了以下查询

select employee_name, max(employee_dept) as dept
from employeeDB 
where employee_name is not null and employee_name != ''
group by employee_name
order by employee_name asc
limit 1000

执行操作时出现错误:ERROR: XX000: 磁盘已满

通过执行以下查询进行调查,我发现我有941GB的可用空间和5000GB的已用空间。

select
  sum(capacity)/1024 as capacity_gbytes, 
  sum(used)/1024 as used_gbytes, 
  (sum(capacity) - sum(used))/1024 as free_gbytes 
from 
  stv_partitions where part_begin=0;

有人能建议如何缓解这个挑战,以便我能获得所需的结果吗?

你的employeeDB表有多大?你可以从svv_table_info中查看表的大小。你在提到的列中使用了什么压缩编码方式? 我的假设是,这与压缩有关。如果不压缩,你的数据将无法适应磁盘。 - Rahul Gupta
2个回答

2

2
+-------+              +-------+
|-------|              |-------|
||10 kb||              ||25 kb||
+-------+              +-------+
|xxxxxxx|              |xxxxxxx|
|xxxxxxx|              |xxxxxxx|
|xxxxxxx+------------->+xxxxxxx|
+-------+              |xxxxxxx|
||10 kb||              |xxxxxxx|
+-------+              |xxxxxxx|
|xxxxxxx|              |xxxxxxx|
|xxxxxxx|              |xxxxxxx|
+-------+              |xxxxxxx|
||05 kb||              |xxxxxxx|
+-------+              +-------+

看一下上面的表示。让我们假设xxxxxxx代表磁盘上占用的空间,而数字代表可用的空闲空间。
两种情况都表示25 kb的空闲空间。但是在情况1中,如果您必须插入(或执行操作)需要连续内存分配的操作,例如15 kb,则无法执行此操作。尽管有可用的25 kb空间,但由于它不是连续的,您可能会遇到内存/磁盘已满错误,因此空间将浪费或被分配给对内存需求非常低的任务。
情况2中,一个连续内存块可用。可以轻松执行需要~ 25kb内存的任务,
这不仅适用于Redshift或DBMS;这适用于任何涉及内存管理的事物,包括操作系统。
引起这种内存分区(称为碎片化)的原因是什么?
“碎片化”是由于在磁盘上不断创建和删除(修改)文件导致的。当占据空间的文件被删除时,会在那里留下一个巨大的内存空洞。小于内存空洞大小的文件可以占用该空间,否则这个空间将被浪费。 所以应该怎么做呢? 进行碎片整理!在您的情况下,Amazon Redshift提供了VACUUM表和/或模式的功能。您可能有足够的磁盘空间,但引擎无法为您执行的任务分配足够的连续内存。

我只是在查询数据,然后将结果导出为csv文件。你能否提供一些建议来解决这个问题,以便我能够高效地查询数据? - StatguyUser
@Enthusiast:尝试在另一台机器上执行上述查询,最好是比您当前使用的机器配置更好的机器。 - Yusuf Hassan
@Enthusiast:如果上面的答案完全符合您的要求,请将其标记为已接受。如果不完全符合,但在某种程度上有所帮助,请点赞。这样,它就不会被遗忘,并且可以帮助那些有类似问题的人。 - Yusuf Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接