gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:50 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com