oracle GetSchema(“Views”)-如何排除sys所有者项以加速执行?

qq24tv8q  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(101)

我使用以下代码进行视图检索

restrictionsArray = new string[ 2 ];
schema = connection.GetSchema( "Views", restrictionsArray );

它需要大约240秒,并返回一个表7500行,25列。我使用.Net Framework Data Provider for Oracle。大部分的物品属于“系统”的所有者。
其他代码

restrictionsArray = new string[ 2 ];
schema = connection.GetSchema( "Tables", restrictionsArray );

大约30克,立即工作。
有没有办法忽略'sys'拥有的项目?

d7v8vwbk

d7v8vwbk1#

DbConnection.GetSchema是一个ADO.NET API,它不能保证由ADO.NET提供程序 * 高性能地 * 实现(即使如此,240秒的元数据查询也是多余的-我猜你在一个高延迟连接上,ADO.NET正在做一个 *RBAR查询 *,这可能解释了它)。
另一种方法是直接查询Oracle的元数据视图(它们的ALL_VIEWS视图大致相当于ISO SQL INFORMATION_SCHEMA.VIEWS元数据视图):
就像这样:

using( OracleConnection c = ... )
using( OracleCommand cmd = c.CreateCommand() )
{
    cmd.CommandText = @"SELECT v.VIEW_NAME FROM ALL_VIEWS AS v WHERE v.OWNER <> 'sys'";

    Stopwatch sw = Stopwatch.StartNew();

    using( OracleDataReader rdr = cmd.ExecuteReader() )
    {
        while( rdr.Read() )
        {
            Console.WriteLine( rdr.GetString( 0 ) );
        }
    }

    sw.Stop();
    Console.WriteLine( "Took {0:N0}ms", sw.ElapsedMilliseconds );
}

相关问题