gpt4 book ai didi

sql - Oracle 语句性能 : Retrieve primary keys exluding combined foreign keys

转载 作者:行者123 更新时间:2023-12-02 04:55:09 25 4
gpt4 key购买 nike

对于我的应用程序,我需要检索特定数据库模式的所有表的主键列,不包括那些也是外键的列。
换句话说,如果一个M:N关系表不使用自己的主键,而是使用两个外键的组合作为主键,则这些列将被排除。

现在可以使用以下语句轻松完成第一部分:

SELECT   ac.table_name,
acc.column_name
FROM all_constraints ac,
all_cons_columns acc
WHERE ac.constraint_name = acc.constraint_name
AND ac.constraint_type = 'P'
AND ac.owner = UPPER('MY_SCHEMA')
ORDER BY ac.table_name, acc.position

在我的案例中,执行此操作大约需要 0.2 秒。现在我尝试使用以下添加排除组合外键:

  AND    NOT EXISTS(
SELECT 1
FROM all_constraints ac1, all_cons_columns acc1
WHERE ac1.constraint_name = acc1.constraint_name
AND ac1.owner = ac.owner
AND ac1.table_name = ac.table_name
AND acc1.column_name = acc.column_name
AND ac1.constraint_type = 'R'
)

现在执行整个语句大约需要 2.5 秒。

是否有更有效的方法来获得相同的结果?

我总是可以执行两个单独的查询,将结果放在列表中并在代码中从列表 1 中删除列表 2 的条目,但我更喜欢使用单个语句解决方案。

为了使这个问题不那么主观,我将制定以下规则:

  • 我会投票给我认为有帮助的任何答案(我总是这样做)
  • 我会接受第一个执行时间低于一秒的答案

PS:我正在使用 Oracle 10g 并且该语句是使用 Oracle.DataAccess.dll.NET 应用程序执行的,但是我从 SqlDeveloper 获得几乎相同的执行时间。


解决方案:

根据 Don Bracuk 的回答,我使用以下语句设法将执行时间缩短到 120 毫秒左右:

SELECT   table_name, column_name
FROM
(
SELECT ac.table_name, acc.column_name
FROM all_constraints ac, all_cons_columns acc
WHERE ac.constraint_type = 'P'
AND ac.owner = UPPER('my_schema')
-- if you wondered, "UPPER" is used as 'my_schema' is inserted at runtime
MINUS
SELECT ac1.table_name, acc1.column_name
FROM all_constraints ac1, all_cons_columns acc1
WHERE ac1.constraint_type = 'P'
AND ac1.owner = UPPER('my_schema')
)
ORDER BY table_name;

最佳答案

你可以试试这个结构:

select yourfields
from yourtables
where whatever
and somefield in
(select somefield
fromyourtables
where the conditions are the same as above
minus
select the same field
from whereever
where you want to exclude it)

如果这是我的问题,我会认为值得尝试。

关于sql - Oracle 语句性能 : Retrieve primary keys exluding combined foreign keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129695/

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