我需要创建包含大量小数 (26,8) 列的宽非规范化表(少于 1024 列限制,大多数列将为空或零)。我知道每行限制为 8060 字节,因此我尝试使用页面压缩创建表。下面的代码创建表,插入一行并查询行大小。行大小远低于限制,但如果我尝试向表中再添加一个小数 (26,8) 列,操作将失败并显示错误“创建或更改表 't1' 失败,因为最小行大小为 8074,包括 1256字节的内部开销。”。有没有办法创建具有这么多列的单个表?
drop table t1
GO
create table t1(c1 decimal(26, 8) null)
with (data_compression = page)
GO
declare @i int = 2;
declare @sql varchar(100);
while @i <= 486
begin
set @sql = 'alter table t1 add c' + convert(varchar, @i) + ' decimal(26, 8) null';
execute (@sql);
set @i += 1;
end;
GO
insert into t1(c1) select 0
GO
declare @i int = 2;
declare @sql varchar(100);
while …
Run Code Online (Sandbox Code Playgroud) 我试图找出外部排序性能,它依赖于 WORK_MEM 值。我已经测试过增加 WORK_MEM 并不总是加速外部排序(下面的例子,在 PostgreSQL 9.6 上测试过)。是否有关于设置 WORK_MEM 的任何指导,说 WORK_MEM 的值是使用外部排序对 4GB 表进行排序的最佳值?是否可以从表大小和 WORK_MEM 设置中估计 IO 的数量?
我知道我可以研究 tuplesort.c 和底层算法,有现成的结果吗?
create table t1
as
select
c as key
, cast('value' as char(5)) as val
from generate_series(1, 100000000) c;
--4223 MB
select pg_size_pretty(pg_total_relation_size('t1'));
\timing
--time - 146725.833 ms
SET WORK_MEM = '128MB';
create table t_128 as select * from t1 order by key;
--time - 148889.655 ms
SET WORK_MEM = '1024MB';
create table t_1024 as select * from t1 order …
Run Code Online (Sandbox Code Playgroud)