通过 ODBC 即时客户端 32 位驱动程序优化访问 NUMBER(14) 列
Optimal access of NUMBER(14) column via ODBC instant client 32-bit driver
我正在开发一个用 C++ 编写的应用程序,它使用 32 位即时客户端驱动程序来访问 Oracle 数据库。该应用程序使用记录字段交换 (RFX) 方法更新数据库 table 中的列。无法修改数据库架构。
C++ 代码最初是为了将 OID 值处理为双精度值而编写的,因为数据库中的 OID 列是 NUMBER(14),因此常规 int 不够大。但是,这会导致数据库偶尔会选择一个错误的执行计划,在该计划中,它采用从应用程序发送的 OID 值并对它们使用 to_binary_double 函数,而不是将它们转换为 BIGINT。如果发生这种情况,数据库不会对数据进行索引搜索,而是进行完整的 table 扫描。
我们尝试在应用程序中将 OID 切换为 __int64 类型,但存在不支持 BigInt 类型(或 C++ 中的 long long)的 ODBC 驱动程序的问题。类似地,当我们试图将 OID 变成 long 时,数据库或驱动程序给出了一个错误,即发送到数据库的值对于该列来说太大了。
在 C++ 中将 OID 作为字符串使用是可行的,但数据库永远不会使用最佳索引搜索,因为它必须先将字符串转换为整数,然后才能进行任何数据检索。因此,我们最好使用已有的双打。
有人知道我们接下来可以做什么吗?如果我们必须像以前一样继续使用双打,那不是世界末日,但我们希望消除数据库缓慢 运行 的机会。
我们实际上选择了“将所有 OID 转换为 C++ 代码中的字符串”选项。事实证明,在将 OID 从字符串转换为整数后,数据库仍然能够 运行 进行索引搜索。如果我们将 ODBC 驱动程序切换到可以处理 BigInt 的驱动程序会更好,但这对我们来说并不是一个真正的选择,所以这就足够了。
我正在开发一个用 C++ 编写的应用程序,它使用 32 位即时客户端驱动程序来访问 Oracle 数据库。该应用程序使用记录字段交换 (RFX) 方法更新数据库 table 中的列。无法修改数据库架构。
C++ 代码最初是为了将 OID 值处理为双精度值而编写的,因为数据库中的 OID 列是 NUMBER(14),因此常规 int 不够大。但是,这会导致数据库偶尔会选择一个错误的执行计划,在该计划中,它采用从应用程序发送的 OID 值并对它们使用 to_binary_double 函数,而不是将它们转换为 BIGINT。如果发生这种情况,数据库不会对数据进行索引搜索,而是进行完整的 table 扫描。
我们尝试在应用程序中将 OID 切换为 __int64 类型,但存在不支持 BigInt 类型(或 C++ 中的 long long)的 ODBC 驱动程序的问题。类似地,当我们试图将 OID 变成 long 时,数据库或驱动程序给出了一个错误,即发送到数据库的值对于该列来说太大了。
在 C++ 中将 OID 作为字符串使用是可行的,但数据库永远不会使用最佳索引搜索,因为它必须先将字符串转换为整数,然后才能进行任何数据检索。因此,我们最好使用已有的双打。
有人知道我们接下来可以做什么吗?如果我们必须像以前一样继续使用双打,那不是世界末日,但我们希望消除数据库缓慢 运行 的机会。
我们实际上选择了“将所有 OID 转换为 C++ 代码中的字符串”选项。事实证明,在将 OID 从字符串转换为整数后,数据库仍然能够 运行 进行索引搜索。如果我们将 ODBC 驱动程序切换到可以处理 BigInt 的驱动程序会更好,但这对我们来说并不是一个真正的选择,所以这就足够了。