c# - 具有复合主键的 SQL 请求

标签 c# sql oracle db2

我必须从两个数据库中获取信息。一个是 ORACLE,另一个是 DB2。在我的程序 (C#) 中,我首先从 ORACLE 数据库中获取对象的基本信息。在第二步中,我想添加保存在 DB2 中的信息。 DB2 中的表具有复合主键,我不确定哪种是最好的请求方式,或者是否有我目前看不到的替代方法。

例如:COLUMN1 和 COLUMN2 是复合主键。

变体 1:

 SELECT * 
   FROM (SELECT COLUMN1, COLUNN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID 
           FROM TABLE1) AS TEMP 
  WHERE ID='2011_123456' 
     OR ID='2011_987654'

这里我认为缺点是对于表中的每一行都建立了字符串连接,并且执行速度相对较慢,因为主键列被索引而新列没有。

变体 2:

SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID 
  FROM TABLE1 
 WHERE (COLUMN1='2011' AND COLUMN2='123456') 
    OR (COLUMN1='2011' AND COLUMN2='987654')

这个真的很快,但每当我收到异常 SQL0954C(应用程序堆中没有足够的存储空间来处理语句)。

变体 3:

SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID 
  FROM TABLE1 
 WHERE COLUMN1 IN ('2011') 
   AND COLUMN2 IN ('123456','987654')

与变体 2 相比,这个也很慢。

一些更多的数字:TABLE1 目前大约有。 60 万行

我尝试了这些变体并得到了以下执行时间:
对于 100 个请求的对象:
变体 1:3900 毫秒
变体 2:218 毫秒

对于 400 个请求的对象:
变体 1:10983 毫秒
变体 2:266 毫秒

对于 500 个请求的对象:
变体 1:12796 毫秒
变体 2:异常 SQL0954C
变体 3:7061 毫秒

只看时间,我更喜欢变体 2,但存在异常问题。

数据库不在我的控制之下,我只有 SELECT 权限。您认为这个用例的最佳选择是什么?还有其他我看不到的可能性吗?

问候,
普科佩

最佳答案

你能对变体 2 做一个修改吗

  • 定义了一个游标
  • 将 100 行(例如)批量收集到一个 pl/sql 表中
  • 做你的处理
  • 获取接下来的 100 行

例如,参见 http://oracletoday.blogspot.com/2005/11/bulk-collect_15.html

我遇到了与 Oracle 和 Informix 非常相似的问题。

关于c# - 具有复合主键的 SQL 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581842/

相关文章:

c# - 路由问题 MVC4

c# - .NET 内存泄漏

mysql - SQL:过滤计算列

.net - .NET/Oracle 架构的数据处理逻辑的最佳位置

c# - 在 MVC 的每个页面上放置重复出现的代码的正确位置是什么

c# - 跨多个应用程序域使用文件时读取\写入文件的最佳方式

sql - 'value'关键字在Oracle Select语句中的作用

mysql - 更新表中的最小值

oracle - 将 800 万条记录从 Oracle 导出到 MongoDB

sql - pl/sql - 集合可以遍历列名吗?