如何排除sys所有者视图以加速GetSchema("Views")执行?
如何排除Oracle中sys所有者的视图
方法一:通过GetSchema的限制参数直接过滤
Oracle .NET数据提供者的GetSchema("Views")方法支持通过限制参数指定所有者范围。你可以将限制数组的第一个元素(对应OWNER字段)直接设置为需要查询的业务用户,这是最高效的方式:
// Views的限制参数最多支持4项,第一项对应所有者字段 string[] restrictionsArray = new string[4]; // 替换成你的业务用户名称,比如"MY_APP_USER" restrictionsArray[0] = "MY_APP_USER"; DataTable schema = connection.GetSchema("Views", restrictionsArray);
方法二:获取所有视图后在内存中过滤
如果不确定具体的业务所有者,或者直接限制参数不生效,可以先获取全部视图,再通过LINQ过滤掉sys所有者的记录:
string[] restrictionsArray = new string[2]; DataTable allViews = connection.GetSchema("Views", restrictionsArray); // 过滤掉OWNER为SYS的视图(忽略大小写匹配) DataTable filteredViews = allViews.AsEnumerable() .Where(row => !string.Equals(row.Field<string>("OWNER"), "SYS", StringComparison.OrdinalIgnoreCase)) .CopyToDataTable();
关于查询速度差异的说明
默认情况下,GetSchema("Tables")只会返回当前用户有权限访问的业务表,而GetSchema("Views")会返回所有可见的系统视图(sys所有者)和业务视图,这就是前者瞬间完成、后者耗时久且结果量巨大的原因。
内容的提问来源于stack exchange,提问作者Darqer
相关产品推荐
相关产品推荐

