Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Regex 优化从perl调用的psql查询_Regex_Perl_Query Optimization_Postgresql - Fatal编程技术网

Regex 优化从perl调用的psql查询

Regex 优化从perl调用的psql查询,regex,perl,query-optimization,postgresql,Regex,Perl,Query Optimization,Postgresql,我一直在努力优化从perl脚本调用的几个查询所消耗的时间和资源。问题如下: 预期行为: 有一个表有超过400万个寄存器,这个表的一个字段(从现在起我称之为f_path)是一个字符串,表示目录路径,它可能包含日期格式的子字符串,也可能不包含日期格式的子字符串。脚本的预期行为是获取这些寄存器的子集,使用f_路径中类似日期的子字符串对其进行过滤,并将其存储在本地文件中,以对其执行某些操作,并在某些图形生成函数中使用数据。过滤器的工作方式如下:获取f_路径中具有相应编码日期子字符串的所有记录,这些记录位

我一直在努力优化从perl脚本调用的几个查询所消耗的时间和资源。问题如下:

预期行为: 有一个表有超过400万个寄存器,这个表的一个字段(从现在起我称之为f_path)是一个字符串,表示目录路径,它可能包含日期格式的子字符串,也可能不包含日期格式的子字符串。脚本的预期行为是获取这些寄存器的子集,使用f_路径中类似日期的子字符串对其进行过滤,并将其存储在本地文件中,以对其执行某些操作,并在某些图形生成函数中使用数据。过滤器的工作方式如下:获取f_路径中具有相应编码日期子字符串的所有记录,这些记录位于用户定义的日期范围内。用户定义此范围,提供最后一个日期(要提取的最新日期)和表示从最后一个日期向后提取的日期数。日期遵循某种顺序模式,但无法计算(可能存在差距)。所有符合用户提供的过滤器参数的日期都将存储在perl中的一个变量中,或者存储在一个文件中,或者同时存储在两个文件中,因为它们稍后将被其他脚本使用,并且还用于控制前面提到的图函数

当前行为: 没有过滤。当前查询获取所有400多万个寄存器并将它们存储在本地文件中,然后在同一个表上运行另一个查询,该表获取f_路径的所有不同值(可能会选择具有相同日期子字符串的两个值,因为即使日期相同,目录路径也可能不同)并将它们存储在perl中的局部变量中,稍后将应用正则表达式获取类似日期的子字符串并将其存储在文件中。问题:这是非常低效的,因为它两次查询整个表,并恢复大量不使用的数据

尝试修复: 遗憾的是,我尝试过的每一件事都比当前的脚本慢:

  • 使用substring函数、regex和用户提供的过滤器参数,从select操作到包含所有数据的表创建一个临时表,以获取要用作过滤器的日期集(而不是整个目录路径值f_path)。然后在f_path字段(实际上称为proj_base)上,在该表和具有所需数据的表之间进行联接,应用substring函数获取类似日期的子字符串,并验证它是否与temp表中的任何值匹配。这种方法还有一个额外的缺点,即与当前脚本一样,我将不得不在脚本的后面再次查询表,以获得充当过滤器的日期集。我可能可以使用我之前创建的临时表,但我不确定当我再次查询日期时它是否仍然存在,我还没有尝试过。看起来是这样的:
psql-U postgres-c“创建临时表TEMP_filter_树作为选择不同的子字符串(proj_base,[0-9]{4}{0-9]{2}}{[0-9]{2}'),作为测试用例中的“树”,按树描述限制30排序;选择mem_tot_大小、mem size_inc pct、tot sim时间、持续时间、cpu util_pct、cpu tot时间、result、,
test_host,proj_base,来自testcase的拓扑,temp_filter_trees其中的子字符串(proj_base,[0-9]{4}{0-9]{2}}{2}')=temp_filter_trees.TREE“$proj>$dir/log_file

  • 使用substring函数和regex查询表中符合筛选参数的所有日期,并将其存储在列表变量中。然后循环将正则表达式应用于此列表变量的字段,以确定它只包含日期,并构建一个包含所有日期的正则表达式,将其用作数据查询中的筛选参数。在获取所有数据的查询中,使用从循环中获得的模式作为过滤器参数。看起来是这样的:
@data=
psql-U postgres-c“从testcase ORDER BY TREE DESC LIMIT 30中选择不同的子字符串(proj_base,[0-9]{4}{[0-9]{2}')作为“TREE”$proj

foreach(@data)
{ 
next unless m/(\d{4}\w{1}\d{2}\w{1}\d{2})$/; 
if(defined $psqlpattern){
$psqlpattern = $psqlpattern ."|$1";
}
else{
$psqlpattern = "'" . $1;
}
push @trees, $1;
}

$psqlpattern=$psqlpattern。"'";

psql-U postgres-c“选择内存总大小、内存总大小、总模拟时间、持续时间、cpu使用时间、cpu总时间、结果、,
test_host,proj_base,来自testcase的拓扑,其中proj_base ~$psqlpattern“$proj>$dir/log_文件

其他想法:我还考虑在获取所有数据的查询中使用f_path字段上的子字符串查询,通过询问是否比过滤器中的最后日期和较旧日期旧,检查类似日期的子字符串是否在用户指定的范围内,那肯定是以前取的。我还没有尝试过这个,但似乎它至少比我尝试过的其他方法更有效率


我们将非常感谢您提供的任何见解或帮助。谢谢你的时间

读取记录的perl i/o操作非常昂贵,尤其是对于4M记录。因此,我推荐的一般方法是在数据库中尽可能多地工作,并集中精力调优数据库查询。我还将尝试通过一次传递来实现这一点,并避免将记录复制到临时表中

因此,作为一个起点,也许可以看看您是否可以通过使用类似于运算符的psql的
或可能的
regexp\u matches
函数的单个查询实现所需。然后根据日期添加另一个条件进行筛选