#906 snmp browser is very slow sometimes

This commit is contained in:
Oliver Gorwits
2022-08-03 15:04:12 +01:00
parent b57b03a060
commit 94c43fcc33
2 changed files with 25 additions and 21 deletions

View File

@@ -11,20 +11,11 @@ __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
__PACKAGE__->table("oid_children");
__PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db2.oid_parts[?])) as children
SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db.oid_parts[?])) as children
FROM device_browser db
LEFT JOIN device_browser db2
ON (db2.oid LIKE ? || '.%'
AND db2.oid_parts[?] = db.oid_parts[?]
AND db2.ip = db.ip)
WHERE db.ip = ?
AND db.oid LIKE ? || '.%'
GROUP BY db.oid_parts
GROUP BY db.oid_parts[?], db.oid_parts
ENDSQL
);

View File

@@ -123,17 +123,30 @@ sub _get_snmp_data {
my @parts = grep {length} split m/\./, $base;
++$recurse;
# psql cannot cope with bind params and group by array element
# so we build a static query instead.
my $next_part = (scalar @parts + 1);
my $child_part = (scalar @parts + 2);
my $query = <<QUERY;
SELECT db.oid_parts[$next_part] AS part,
count(distinct(db.oid_parts[$child_part])) as children
FROM device_browser db
WHERE db.ip = ?
AND db.oid LIKE ? || '.%'
GROUP BY db.oid_parts[$next_part]
QUERY
my $rs = schema('netdisco')->resultset('Virtual::GenericReport')->result_source;
$rs->view_definition($query);
$rs->remove_columns($rs->columns);
$rs->add_columns(qw/part children/);
my %kids = map { ($base .'.'. $_->{part}) => $_ }
schema('netdisco')->resultset('Virtual::OidChildren')
->search({}, { bind => [
(scalar @parts + 1),
(scalar @parts + 2),
$base,
(scalar @parts + 1),
(scalar @parts + 1),
$ip,
$base,
] })->hri->all;
schema('netdisco')->resultset('Virtual::GenericReport')
->search(undef, {
result_class => 'DBIx::Class::ResultClass::HashRefInflator',
bind => [$ip, $base],
})->hri->all;
return [{
text => 'No SNMP data for this device.',