【问题标题】:select row from multiple tables with least performance impact从多个表中选择对性能影响最小的行
【发布时间】:2015-10-21 13:51:25
【问题描述】:

我有 2 个具有相同列的表。例如,workInfo 是一个表,oldworkinfo 是另一个表。列可以是-id、branch、product、Data。 (id 是唯一的主键。)当事务完成时,它会从 workinfo 中删除并移动到 oldworkinfo 。

我想编写一个查询以首先从 workinfo 然后 oldworkinfo 进行最佳搜索,因为我必须在其他表中执行一些连接操作。

即首先在workinfo表中搜索,如果记录可用则返回,否则在oldworkinfo中搜索并返回记录。以下是我使用联合编写的示例查询,但这确实在两个表中都进行了搜索。

with squery as 
(select * from workinfo 
UNION ALL
select * from oldworkinfo)
Select * from squery where squery.id=Key; 

请建议在单个查询中是否可以这样做。我不能使用 plsql 选项,因为整体连接和其他查询变得复杂。

【问题讨论】:

    标签: sql oracle select union


    【解决方案1】:
    with sub as
    (select * from workinfo wi where wi.id = mykey)
    select * from sub
    union all
    select * from oldworkinfo owi where owi.id = mykey and not exists (select * from sub)
    

    edit :需要union all 来搜索两个表中的行。通过在 oldworkinfo 上的查询中添加 not exists 子句,您可以确保仅当 workinfo 中没有数据时才选择其数据。

    工作查询将是select * from workinfo where id=mykey union all select * from oldworkinfo where id=mykey and not exists (select * from workinfo where id=mykey)

    出于性能和可读性的原因,我使用了with 子句,以便对workinfo 的查询只执行一次。

    【讨论】:

    • 尝试以下 -- 使用 sub as (select id,Appdata1,Appdata3 from workinfo wi where wi.id = 46940) select id,Appdata1,Appdata3 from sub union all select id,Appdata1,Appdata3 from oldworkinfo owi where owi.id = 46940 and not exists (select id,Appdata1 from sub) .. Plan 仍然显示 TABLE ACCESS OLDWORKINFO BY INDEX ROWID ...在此 46940 中仅在 Workinfo 表中可用。
    • 如果您使用单个查询,我认为您无法使第二个表从计划中消失。但是我在“旧”表未编入索引的类似情况下测试了我的解决方案:当查找通常表中的 ID 时,它会立即返回并且不会花时间在“旧”表中搜索,并且仅当查找“旧”表中的 ID 会花费大量时间。
    【解决方案2】:

    据我了解,主要思想是避免对包含历史数据的大表进行不必要的扫描。这个查询可以帮助避免它:

    select * from workinfo where id = Key
    UNION ALL
    select * from oldworkinfo where 
    not exists (
        select null
        from workinfo wi where wi.id = Key
    )
    and id = Key
    

    【讨论】:

    • 嗨,stepan,我已经尝试过上面的查询,但解释计划仍然显示可以访问 oldworkinfo。通过 ROWID ,当我尝试仅在 workinfo 表中的 id 时。这可能是不可能的。?
    • 你好模拟人生。我看不到任何选项可以通过简单的选择完全从计划中消除它,也许像这里描述的那样处理“找不到数据”异常 - stackoverflow.com/questions/5955025/… 可以帮助你。
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2015-06-28
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多