我必须从两个数据库中获取信息。一个是 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/