2009-01-22 123 views

回答

2

有一個在DBI一個statistics_info()方法,但不幸的是,唯一的DBD我已經看到了它在迄今實行的是DBD :: ODBC。所以如果你使用ODBC(update:或者PostgreSQL!),你很幸運。否則,sp_helpindex(或sysindexes表)的性能與Sybase相當。

下面是我用爲Sybase(在我自己的OO模塊 - 除非all_indexes說法是事實,就只返回唯一索引):

{ 
my $sql_t = <<EOT; 
select 
    sysindexes.name, 
    index_col(object_name(sysindexes.id), sysindexes.indid, syscolumns.colid) col_name 
from sysindexes, syscolumns 
where sysindexes.id = syscolumns.id 
    and syscolumns.colid <= sysindexes.keycnt 
    and sysindexes.id = object_id(%s) 
EOT 

sub index_info { 
    my ($self, $table, $all_indexes) = @_; 

    my $dbh = $self->{DBH}; 
    my $sql = sprintf $sql_t, $dbh->quote($table); 
    $sql .= "and sysindexes.status & 2 = 2\n" unless $all_indexes; 
    my $sth = $dbh->prepare($sql); 
    $sth->execute(); 
    my @col_names = @{$sth->{NAME_lc}}; 
    my %row; $sth->bind_columns(\@row{@col_names}); 
    my %ind; 
    while ($sth->fetch()) { 
    if ($row{col_name}) { 
     push @{$ind{$row{name}}}, lc($row{col_name}); 
    } 
    } 
    return unless %ind; 
    return \%ind; 
} 

} 

或者,如果你的目標是把剛纔複製指數,也許你應該得到dbschema.pl實用程序(它使用Sybase :: DBlib)。它將爲您生成「CREATE INDEX」語句。

+0

DBD :: Pg也實現了這一點。 – 2009-01-22 23:33:29

0
SELECT i.* 
FROM sysobjects o, sysindexes i 
WHERE o.name = $name 
    AND i.id = o.id 
相關問題