TSContainerPurge 函数

TSContainerPurge 函数从一个或多个容器中删除指定时间戳记内的时间系列数据。

语法

TSContainerPurge(
           control_file  lvarchar,
           location      lvarchar default 'client',
           flags         integer default 0);
returns lvarchar
control_file
文本文件的名称,此文件包含有关要从哪些容器删除哪些元素的信息。此文件必须具有以下格式的一行或多行:
container_name|instance_id|end_range|
container_name
要从中删除元素的容器的名称。
instance_id
时间系列实例的唯一标识。实例是包含 TimeSeries 列的表中的一行。
end_range
“删除”范围的结束时间。对于规则时间系列,是指要删除的最后一个时间戳记的索引。对于不规则时间系列,是指要删除的最后一个时间戳记。
location(可选)
控制文件的位置。可以是以下任一值:
’client’
缺省值。控制文件位于客户机计算机上。
’server’
控制文件位于数据库服务器所在的计算机上。
flags(可选)
确定删除行为。可以是以下任一值:
0
仅当一个页面上的所有元素均与删除条件相匹配时,才删除与删除条件匹配的元素。将释放生成的空页面。
1
对于其所有元素与删除条件相匹配的页面,将删除页面上的元素并释放这些页面。与删除条件匹配的剩余元素将设置为 NULL。

用法

使用 TSContainerPurge 函数可从容器中除去旧数据。TSContainerPurge 函数会删除符合以下条件的页面:页面中所有元素的时间戳记都等于或早于指定容器中指定时间系列实例的指定结束时间。将释放生成的空页面。

可以使用 TSContainerPurge 函数从行中除去使用除容器定义中所指定子类型以外的 TimeSeries 子类型的数据。但是,容器定义中指定的 TimeSeries 子类型必须存在。

可以通过将用于定义删除条件的 SELECT 语句的结果卸载到文件中,从而创建控制文件。在 SELECT 语句中使用以下 TimeSeries 函数可在控制文件中填充容器名称和实例标识,对于规则时间系列,还会填充每个实例的结束范围的索引:

如果打算一次性删除大量数据,那么运行多个 TSContainerPurge 函数来删除不同容器中的数据可能会比运行单个 TSContainerPurge 函数来删除的速度快。

返回结果

LVARCHAR 字符串,用于描述受影响的容器数、释放的页面数和删除的元素数。例如:

"containers(4) deleted_pages(2043) deleted_slots(260300)"

示例 1:从多个容器中删除规则时间系列数据

以下语句创建名为 regular_purge.unl 的控制文件,用于从存储 10 个规则时间系列实例的所有容器中删除这些实例中的元素:

UNLOAD TO 'regular_purge.unl' 
       SELECT GetContainerName(readings),InstanceId(readings), 
              GetIndex(readings,'2011-10-01 23:45:00.00000'::datetime year to 
                       fraction(5))::varchar(25) 
       FROM sm 
       WHERE meter_id IN ('met0','met1','met11','met4','met5','met6',
                          'met61','met7','met8','met9'); 

生成的控制文件具有以下内容:

sm0|1|7871| 
sm0|8|7295| 
sm0|13|6911| 
sm1|2|7775| 
sm1|9|7199| 
sm1|14|6815| 
sm2|3|7679| 
sm2|10|7103| 
sm3|7|7391| 
sm3|12|7007| 

在 WHERE 子句中指定的 10 个时间系列实例存储在四个不同的容器中,这些容器列在第一列中。第二列中列出每个时间系列实例的标识。第三列中列出与时间戳记 2011-10-01 23:45:00.00000 对应的元素索引号。

以下语句删除这 10 个时间系列实例在 2011-10-01 23:45:00.00000 之时及之前的所有元素:

EXECUTE FUNCTION TSContainerPurge('regular_purge.unl',1);

保留的任何已删除元素将标记为 NULL。

示例 2:从特定容器中删除元素

以下语句创建控制文件 regular_purge2.unl,用于删除容器 sm0 中所有时间系列实例的元素:

UNLOAD TO regular_purge2.unl 
       SELECT GetContainerName(readings),InstanceId(readings),
              GetIndex(readings,'2011-10-01 23:00:00.00000'::datetime 
                       year to fraction(5))::varchar(25)
       FROM sm
       WHERE GetContainerName(readings) = 'sm0';

生成的控制文件具有单个容器的条目:

sm0|1|7871| 
sm0|8|7295| 
sm0|13|6911|  

示例 3:删除不规则时间系列数据

以下语句创建控制文件 irregular_purge.unl,用于删除四个不规则时间系列实例中的元素:

UNLOAD TO irregular_purge.unl 
       SELECT GetContainerName(readings),InstanceId(readings),
                   '2011-10-01 23:00:00.00000'::varchar(25)
       FROM sm
       WHERE meter_id IN ('met12','met2','met3','met62');

生成的控制文件包括结束时间戳记,而不是元素索引号,例如:

sm4|4|2011-10-01 23:45:00.00000| 
sm4|6|2011-10-01 23:45:00.00000| 
sm5|5|2011-10-01 23:45:00.00000| 
sm5|11|2011-10-01 23:45:00.00000|