带有 Spring 的 JDBC 缓慢元数据获取 Oracle

2023-12-21

我正在使用春天JdbcUtils.extractDatabaseMetaData()方法来分析数据库。该函数调用回调并移交DatabaseMetaData目的。该对象提供了getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern).

我这样称呼它getColumns("",TABLE_OWNER_USERNAME,null,null)结果得到 400 列。这些正是我想要的结果,但请求需要超过 1 分钟。

我可以以某种方式优化这个查询以使其更快吗?拉取 400 行应该在 1 秒内完成,而不是一分钟。

EDIT:我不怀疑 Spring 部分很慢。更仔细的分析表明,获取DatabaseMetaData需要几秒钟,但执行getColumns()需要很长时间。


对客户端和服务器之间的实际通信进行逆向工程后,我可以发现 Oracle 的 DatabaseMetaData.getColumns() 方法发送以下 SQL 查询(尽管这可能会随 ODBC 驱动程序版本和设置而变化):

    declare
    in_owner varchar2(128);
    in_name varchar2(128);
    in_column varchar2(128);
    xyzzy SYS_REFCURSOR;
    begin
    in_owner := :1;  // Which resolves to the schema (user) name supplied
    in_name := :2;   // Which resolves to the table name supplied
    in_column := :3; // Which gets set to '%';
    open xyzzy for
    SELECT NULL AS table_cat,
        t.owner AS table_schem,
        t.table_name AS table_name,
        t.column_name AS column_name,
    DECODE(  (SELECT a.typecode
        FROM ALL_TYPES A
        WHERE a.type_name = t.data_type),
    'OBJECT', 2002,
    'COLLECTION', 2003,
    DECODE(substr(t.data_type, 1, 9),
        'TIMESTAMP',
        DECODE(substr(t.data_type, 10, 1),
            '(',
            DECODE(substr(t.data_type, 19, 5),
                'LOCAL', -102, 'TIME ', -101, 93),
            DECODE(substr(t.data_type, 16, 5),
            'LOCAL', -102, 'TIME ', -101, 93)),
        'INTERVAL ',
        DECODE(substr(t.data_type, 10, 3),
        'DAY', -104, 'YEA', -103),
        DECODE(t.data_type,
        'BINARY_DOUBLE', 101,
        'BINARY_FLOAT', 100,
        'BFILE', -13,
        'BLOB', 2004,
        'CHAR', 1,
        'CLOB', 2005,
        'COLLECTION', 2003,
        'DATE', 93,
        'FLOAT', 6,
        'LONG', -1,
        'LONG RAW', -4,
        'NCHAR', -15,
        'NCLOB', 2011,
        'NUMBER', 2,
        'NVARCHAR', -9,
        'NVARCHAR2', -9,
        'OBJECT', 2002,
        'OPAQUE/XMLTYPE', 2009,
        'RAW', -3,
        'REF', 2006,
        'ROWID', -8,
        'SQLXML', 2009,
        'UROWI', -8,
        'VARCHAR2', 12,
        'VARRAY', 2003,
        'XMLTYPE', 2009,
        1111)))
    AS data_type,
        t.data_type AS type_name,
        DECODE (t.data_precision, null,
            DECODE(t.data_type, 'NUMBER',
                DECODE(t.data_scale, null, 0 , 38),
                    DECODE (t.data_type, 'CHAR', t.char_length, 'VARCHAR', t.char_length, 'VARCHAR2', t.char_length, 'NVARCHAR2', t.char_length, 'NCHAR', t.char_length, 'NUMBER', 0, t.data_length) ), t.data_precision)
        AS column_size,
        0 AS buffer_length,
        DECODE (t.data_type, 'NUMBER', DECODE(t.data_precision, null, DECODE(t.data_scale, null, -127 , t.data_scale), t.data_scale), t.data_scale) AS decimal_digits,
        10 AS num_prec_radix,
        DECODE (t.nullable, 'N', 0, 1) AS nullable,
        NULL AS remarks,
        t.data_default AS column_def,
        0 AS sql_data_type,
        0 AS sql_datetime_sub,
        t.data_length AS char_octet_length,
        t.column_id AS ordinal_position,
        DECODE (t.nullable, 'N', 'NO', 'YES') AS is_nullable,
        null as SCOPE_CATALOG,
        null as SCOPE_SCHEMA,
        null as SCOPE_TABLE,
        null as SOURCE_DATA_TYPE,
        'NO' as IS_AUTOINCREMENT,
        t.virtual_column as IS_GENERATEDCOLUMN
    FROM all_tab_cols t
    WHERE t.owner LIKE in_owner ESCAPE '/'
    AND t.table_name LIKE in_name ESCAPE '/'
    AND t.column_name LIKE in_column ESCAPE '/'
    AND t.user_generated = 'YES'
    ORDER BY table_schem, table_name, ordinal_position;
    end;

您可以理解为什么这可能有点慢,特别是当 ALL_TAB_COLS 和 ALL_TYPES 表都可以有 1000 条记录长时。然而,尽管 Oracle 努力执行第一次调用(几分钟),但后续调用几乎立即返回结果。这是一个典型的表连接性能问题,即使需要一部分数据,引擎也会连接整个数据集before计算并提供所需的子集。随后的数据/结果缓存可提高后续查询的性能。

更好的解决方案可能是使用 get_ddl() 并按照以下方式解析返回的表定义这个线程 https://stackoverflow.com/questions/13448860/how-to-view-all-the-metadata-of-columns-of-a-table-in-oracle-database.

或者您可以通过执行虚拟查询然后使用 resultSetMetadata 更快地查询表上的元数据,如下所示(注意:列备注元数据可能无法立即可用):

    ResultSet rs = connection.CreateStatement.executeQuery("SELECT * from MyTable WHERE 1=0");
    ResultSetMetaData md = rs.getMetaData();
    for (int ix = 1; ix <= md.getColumnCount(); ix++)
    {
      int colSize = md.getPrecision(ix);
      String nativeType = md.getColumnTypeName(ix);
      int jdbcType = md.getColumnType(ix);
      // and so on....
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 Spring 的 JDBC 缓慢元数据获取 Oracle 的相关文章

  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr

随机推荐

  • OpenERP (Odoo) 在哪里找到模块路径?

    我正在使用 Odoo v 8 我想找出 Odoo 在哪里找到模块所在的信息并加载它们 我知道文件 openerp server conf 中有一个变量 addons path 我找到该变量的唯一文件是 opt odoo odoo debia
  • Python:按索引过滤列表

    在Python中我有一个元素列表aList和索引列表myIndices 有什么方法可以一次检索所有这些项目aList将以下值作为索引myIndices Example gt gt gt aList a b c d e f g gt gt g
  • 在 JavaScript 中保存哈希/锚点更改的历史记录

    我目前正在实现一个 JavaScript 库 用于跟踪地址栏中哈希部分的更改历史记录 这个想法是 您可以在哈希部分保留一个状态 然后使用后退按钮返回到之前的状态 在大多数最新的浏览器中 这是自动的 您只需轮询location hash属性进
  • npm run 运行缓慢

    我曾经通过 Makefile 运行各种命令 但对于 Nodejs 项目来说 package json 是更合适的地方 通过 npm 运行命令效果很好 但与命令时间执行相比非常慢 time node modules bin jshint no
  • IIS 7.5 修复尝试加载格式不正确的程序问题?

    我遇到一个异常问题 抛出异常 尝试加载格式不正确的程序 错误 我在同一台 IIS 服务器上有两个相同的网站 我的构建配置适用于其中一个 但不适用于另一个 我的 C MVC 2 Web 应用程序可以部署到驻留在同一 IIS 7 5 Web 服
  • 有没有比 dict() 更快的东西?

    我需要一种更快的方式来存储和访问大约 3GB 的数据k v对 在哪里k是一个字符串或一个整数并且v is an np array 可以有不同的形状 是否有任何对象在存储和访问这样的表时比标准 python 字典更快 例如 一个pandas
  • SceneKit 在立方体测试中的性能

    在学习游戏 3D 图形编程时 我决定从使用 Scene Kit 3D API 开始简单 我的第一个游戏目标是构建一个非常简化的 我的世界 的模仿版 一个只有立方体的游戏 这有多难 下面是我编写的一个循环 用于放置 100 x 100 立方体
  • Fragments 中的“onViewStateRestored”如何工作?

    我真的对 Fragment 的内部状态感到困惑 我有一个活动一次只保存一个片段 并在应该显示另一个片段时替换它 来自文档onSaveInstanceState叫做ONLY如果活动onSaveInstanceState正在被调用 在我的例子中
  • 预加载图像的最佳方式

    预加载图像的最佳方法是什么 我正在尝试创建一个包含大约 59 张 png 图像的图像选项卡 这是我到目前为止的代码
  • 当 SBValue 来自 Swift 字典时,SBData 是错误的

    我正在尝试编写一个Python函数来格式化Foundation Decimal 用作类型摘要器 我把它发布在这个答案 https stackoverflow com a 52749749 77567 我还将它包含在这个答案的底部 并带有额外
  • GCC 使用 typedef 不兼容的指针类型

    我有一些代码在 GCC 4 8 4 下编译得很好 我最近升级了我的系统 现在有了 GCC 5 2 1 并且我收到了有关不兼容指针类型的警告 我已将问题提取到一个重现错误的小示例中 typedef const double ConstSpic
  • 如何计算当前行与下一行?

    在 Spark Sql 1 6 版本中 使用DataFrames 有没有一种方法可以计算特定列的每一行的当前行和下一行的总和 例如 如果我有一个只有一列的表 如下所示 Age 12 23 31 67 我想要以下输出 Sum 35 54 98
  • 如何在不损失质量的情况下放大微小的文本图像?

    文本图像非常小 大小为 17px x 10px MacOS下可以完美放大 let width scale image size width kScale let height scale image size height kScale s
  • 尝试获取数据来创建菜单,getStaticProps 返回未定义

    我正在使用 Next js 13 和 Strapi 我想做一个Menu组件使用getStaticProps 我创建并添加了一个Layout组件中的 app js And a Menu里面的组件Layout 我测试了里面的代码getStati
  • 如何找到检测到的霍夫线的角度?

    我的目标是使用开放CV 检测骨折的骨头 我尝试了以下代码 并获得了正确的精明检测边缘 还找到了粗糙线 但现在我的工作是检测图像中的断裂点 我不明白如何进一步进行 在一些博客中 我发现我们可以确定粗糙线的角度来检测该线是否是直的 但不知道如何
  • 如何从 Twitter Bootstrap 中删除未使用的样式?

    我的引导样式表大小约为 120kb 但我只使用了 25 的样式表代码 我不想要那个 span 类 我通过在引导程序中自定义它来尝试它自定义页面 http twitter github com bootstrap customize html
  • 使用Dataadapter更新时出现DBConcurrency异常

    我正在尝试编辑DataTable填充者NpgsqlDataAdapter 打电话后Fill 方法 我只有一行DataTable 然后我只更改了一列的值并尝试更新如下 然后我收到这个错误 发生 DBConcurrencyException 我
  • 使用实体框架时为 Select() 创建通用选择器

    我想创建一个函数来检索给定属性名称的类型的列表 但我还不知道如何创建一个有效的 lambda 选择器 public IList GetDistinctListOfProperty string propertyName var propIn
  • 如何渲染祖先树视图的嵌套 ul 列表

    我想使用 content tag 渲染如下所示的结构 其中集合是祖先对象 ul li a Fruits a ul li a Apple a li li a Orange a li ul li li a Colours a li ul 我相信
  • 带有 Spring 的 JDBC 缓慢元数据获取 Oracle

    我正在使用春天JdbcUtils extractDatabaseMetaData 方法来分析数据库 该函数调用回调并移交DatabaseMetaData目的 该对象提供了getColumns String catalog String sc