【发布时间】:2013-04-12 00:32:14
【问题描述】:
open(INFILE1,"INPUT.txt");
my $modfile = 'Data.txt';
open MODIFIED,'>',$modfile or die "Could not open $modfile : $!";
for (;;) {
my $line1 = <INFILE1>;
last if not defined $line1;
my $line2 = <INFILE1>;
last if not defined $line2;
my ($tablename1, $colname1,$sql1) = split(/\t/, $line1);
my ($tablename2, $colname2,$sql2) = split(/\t/, $line2);
if ($tablename1 eq $tablename2)
{
my $sth1 = $dbh->prepare($sql1);
$sth1->execute;
my $hash_ref1 = $sth1->fetchall_hashref('KEY');
my $sth2 = $dbh->prepare($sql2);
$sth2->execute;
my $hash_ref2 = $sth2->fetchall_hashref('KEY');
my @fieldname = split(/,/, $colname1);
my $colcnt=0;
my $rowcnt=0;
foreach $key1 ( keys(%{$hash_ref1}) )
{
foreach (@fieldname)
{
$colname =$_;
my $strvalue1='';
@val1 = $hash_ref1->{$key1}->{$colname};
if (defined @val1)
{
my @filtered = grep /@val1/, @metadata;
my $strvalue1 = substr(@filtered[0],index(@filtered[0],'||') + 2);
}
my $strvalue2='';
@val2 = $hash_ref2->{$key1}->{$colname};
if (defined @val2)
{
my @filtered = grep /@val2/, @metadata2;
my $strvalue2 = substr(@filtered[0],index(@filtered[0],'||') + 2);
}
if ($strvalue1 ne $strvalue2 )
{
$colcnt = $colcnt + 1;
print MODIFIED "$tablename1\t$colname\t$strvalue1\t$strvalue2\n";
}
}
}
if ($colcnt>0)
{
print "modified count is $colcnt\n";
}
%$hash_ref1 = ();
%$hash_ref2 = ();
}
程序是读取输入文件,其中每一行包含三个由制表符分隔的字符串。第一个是表名,第二个是所有列名,中间有逗号,第三个包含要运行的 sql。由于此实用程序正在比较数据,因此每个表名都有两行。每个数据库一个。因此需要从每个相应的数据库中挑选数据,然后逐列比较。
SQL 在结果集中作为 ID 返回,如果值来自 db,则需要通过从数组中读取将其转换为字符串(该数组包含 100K 条记录,键和值由 || 分隔)
现在我为一组表运行了这个,每个表中包含 18K 条记录。每个 sql 中从 db 中选择了 8 列。因此,对于 18K 中的每条记录,然后对于该记录中的每个字段(即 8),此脚本都需要大量时间。
我的问题是,是否有人可以查看是否可以对其进行改进以减少花费的时间。 文件内容示例
INPUT.TXT
TABLENAME COL1,COL2 select COL1,COL2 from TABLENAME where ......
TABLENAMEB COL1,COL2 select COL1,COL2 from TABLENAMEB where ......
元数据数组包含类似这样的东西(每个数据库有两个)
111||Code 1
222||Code 2
请推荐
【问题讨论】:
-
您是否通过分析器(如 Devel::NYTProf 或 Devel::DProf)运行它并消除了 SQL 执行延迟的可能性?
-
通常
prepare在循环中是一件坏事。你确定你不能prepare循环外的所有查询,而只是execute他们稍后使用不同的参数? -
查询是否总是返回相同的列集?你实际上在比较什么?代码很乱,但你能说出你在找什么吗?例如。 我想要 TABLENAME 中但不在 TABLENAMEB 中的所有行的列表 或类似的东西?
-
要求 a) 两个 diff dbs 的表集的逐列比较 b) 由其他程序创建的 sql 集,因此生成的 sql 存储在文件中。 c)两个数据库中每个表的布局都是相同的。 d) 列值始终是每个 db 的 id,但不能比较,因为两个 db 中的 id 不同,因此使用数组。关于循环内的准备,这是唯一的方法,因为每个表都有要比较的 diff 列。所以需要循环。另外,我会尝试使用分析器。但是我在测试的时候放了这么多打印语句,可以确认sqls并没有花费太多时间。
-
真的有两个不同的数据库吗?或者,同一个数据库中只有两个表?
标签: perl