选择不同...内连接与选择...其中 id in (...)

2023-12-02

我正在尝试创建表的子集(作为物化视图),定义为在另一个物化视图中具有匹配记录的记录。

例如,假设我有一个包含 user_id 和 name 列的用户表,以及一个包含entry_id、user_id、activity 和 timestamp 列的日志表。

首先,我创建日志表的物化视图,仅选择时间戳 > some_date 的行。现在我想要日志表快照中引用的用户的物化视图。我可以将其创建为

select * from Users where user_id in (select user_id from Log_mview)

或者我可以做

select distinct u.* from Users u inner join Log_mview l on u.user_id = l.user_id

(需要不同的以避免来自具有多个日志条目的用户的多次点击)。

前者看起来更干净、更优雅,但需要更长的时间。我错过了什么吗?有一个更好的方法吗?

编辑:where exists子句有很大帮助,除了条件使用OR。例如,假设上面的日志表也有一个 user_name 列,将日志条目与用户记录匹配的正确方法是当任一列(用户 ID 或用户名)匹配时。我发现

select distinct u.* from Users u
    inner join Log_mview l
        on u.user_id = l.user_id or u.name = l.user_name

select * from Users u where exists
    (select id from Log_mview l 
        where l.user_id = u.user_id or l.user_name = u.name)

有什么帮助吗?

(关于解释计划......让我努力清理它,或者它们,而不是......我会在一段时间后发布它们。)

编辑:解释计划: 对于使用内连接的查询:


Plan hash value: 436698422

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                     |  4539K|   606M|       |   637K  (3)| 02:07:25 |
|   1 |  HASH UNIQUE                    |                     |  4539K|   606M|  3201M|   637K  (3)| 02:07:25 |
|   2 |   CONCATENATION                 |                     |       |       |       |            |          |
|*  3 |    HASH JOIN                    |                     |  4206K|   561M|    33M|   181K  (4)| 00:36:14 |
|   4 |     BITMAP CONVERSION TO ROWIDS |                     |   926K|    22M|       |  2279   (1)| 00:00:28 |
|   5 |      BITMAP INDEX FAST FULL SCAN| I_M_LOG_MVIEW_4     |       |       |       |            |          |
|*  6 |     TABLE ACCESS FULL           | USERS               |    15M|  1630M|       | 86638   (6)| 00:17:20 |
|*  7 |    HASH JOIN                    |                     |  7646K|  1020M|    33M|   231K  (4)| 00:46:13 |
|   8 |     BITMAP CONVERSION TO ROWIDS |                     |   926K|    22M|       |  2279   (1)| 00:00:28 |
|   9 |      BITMAP INDEX FAST FULL SCAN| I_M_LOG_MVIEW_4     |       |       |       |            |          |
|  10 |     TABLE ACCESS FULL           | USERS               |    23M|  2515M|       | 87546   (7)| 00:17:31 |
---------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("U"."NAME"="L"."USER_NAME")
   6 - filter("U"."NAME" IS NOT NULL)
   7 - access("U"."USER_ID"=TO_NUMBER("L"."USER_ID"))
       filter(LNNVL("U"."NAME"="L"."USER_NAME") OR LNNVL("U"."NAME" IS NOT NULL))

Note
-----
   - dynamic sampling used for this statement  

对于使用的人来说where exists:


Plan hash value: 2786958565

-----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                     |     1 |   114 |    21M  (1)| 70:12:13 |
|*  1 |  FILTER                       |                     |       |       |            |          |
|   2 |   TABLE ACCESS FULL           | USERS               |    23M|  2515M| 87681   (7)| 00:17:33 |
|   3 |   BITMAP CONVERSION TO ROWIDS |                     |  7062 |   179K|     1   (0)| 00:00:01 |
|*  4 |    BITMAP INDEX FAST FULL SCAN| I_M_LOG_MVIEW_4     |       |       |            |          |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( EXISTS (SELECT /*+ */ 0 FROM "MYSCHEMA"."LOG_MVIEW" 
              "LOG_MVIEW" WHERE ("USER_NAME"=:B1 OR TO_NUMBER("USER_ID")=:B2) AND 
              ("USER_NAME"=:B3 OR TO_NUMBER("USER_ID")=:B4) AND ("USER_NAME"=:B5 OR 
              TO_NUMBER("USER_ID")=:B6)))
   4 - filter("USER_NAME"=:B1 OR TO_NUMBER("USER_ID")=:B2)

Note
-----
   - dynamic sampling used for this statement  

更改数据库对象名称以保护无辜者。 :p


Try this

select * from Users u
where exists 
   ( select user_id 
     from Log_mview l
     where l.user_id = u.user_id )
/

如果子查询返回大量行WHERE EXISTS可以大大快于WHERE ... IN.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择不同...内连接与选择...其中 id in (...) 的相关文章

随机推荐

  • Pandas - 根据多列进行分组并在组内排名

    我有一个像这样的数据框 df pd DataFrame asset id 10 10 10 20 20 20 method id p2 p3 p4 p3 p1 p2 method rank 5 2 2 2 5 1 conf score 0
  • zbar sdk 无法通过使用相机模拟器在 iPhone 模拟器上工作

    我的项目必须支持条形码扫描 我正在使用 zbar sdk 我已经集成了代码并使用 iphone 模拟器运行 我正在使用相机模拟器扫描条形码 它正确打开条形码图像 但条形码扫描不起作用 有人用过这个吗 您可以在iPhone模拟器上测试条形码
  • 如何在Java Restlet中访问请求的标头值?

    我正在使用开发网络服务Restlet Java 为此 我想保护一些网络服务免受未经授权的客户端的侵害 所以我写了Filter类 在那个 Filter 类中我想得到headers请求的 但我收到以下错误 java lang ClassCast
  • 为什么我无法使用单个点访问整数的属性?

    如果我尝试写 3 toFixed 5 存在语法错误 使用双点 插入空格 将三个点放在括号中或使用方括号表示法可以使其正常工作 3 toFixed 5 3 toFixed 5 3 toFixed 5 3 toFixed 5 为什么单点表示法不
  • 如何在 SQL 中抑制或隐藏重复值?

    我已经四处寻找了一下 但还没有找到如何做到这一点 尽管已经找到了很多关于分析其性能的信息 我想执行一个选择 它返回几列数据 然后还返回另一个表中相关行的嵌套表 实际上是同一个表本身连接 但我 认为 这是不相关的 所以数据是这样的 id na
  • WPF 和初始焦点

    似乎当 WPF 应用程序启动时 没有任何东西具有焦点 这实在是太奇怪了 我使用过的所有其他框架都符合您的预期 将初始焦点放在 Tab 键顺序中的第一个控件上 但我已经确认它是 WPF 而不仅仅是我的应用程序 如果我创建一个新窗口 然后在其中
  • 在 Python 中对正则表达式执行 WebDriverWait() 或类似检查

    我希望能够执行类似于WebDriverWait i e WebDriverWait driver 60 until expected conditions text to be present in element By XPATH tr
  • Android Studio 和 AdMob -- 无法实例化以下类

    我一直在尝试在我的应用程序中使用 AdMob 横幅广告 但不断收到错误消息 无法实例化以下类 com google android gms ads AdView java lang VerifyError Expecting a stack
  • 如何摆脱android全屏模式下的顶部褪色边缘?

    通过将以下两行代码放入activity OnCreate中 我可以获得全屏视图 requestWindowFeature Window FEATURE NO TITLE getWindow setFlags WindowManager La
  • 字符串资源文件中的格式语句

    我在通常的 strings xml 资源文件中定义了字符串 如下所示
  • 将 Excel 工作表添加到工作簿末尾

    我正在尝试将 Excel 工作表添加到工作簿的末尾 保留第一个工作表作为摘要 import win32com client Excel win32com client DispatchEx Excel Application Book Ex
  • Java 到 JSP - 如何将 Java 应用程序集成到 JSP 网页中?

    好吧 这肯定是今天最简单的问题了 这是我第一次尝试 Java 和 JSP 我刚刚使用 Eclipse 编写了一个小型 Java 应用程序 现在我想将这个小应用程序提供到网页中 我需要弄清楚Java应用程序和网页之间的联系 这是我的申请 pu
  • Putty - 使用 C# 动态删除文件

    我正在开发一个使用 C 作为编程语言的 Windows 应用程序 要求是 动态登录putty 从特定位置删除旧文件 我目前正在使用下面的代码登录 Putty 但如何运行删除命令 string hostname hostname string
  • Plotly:更新菜单的按钮实际上是如何工作的?

    我为什么想知道 这似乎是一个非常简单的问题 但我在使用下拉菜单编辑具有多个轨迹的图形时遇到了一些困难 所以我真的很渴望确保我理解plotlys下拉菜单 更新菜单和按钮的内部工作原理100 正确 因此 如果有人能抽出时间来看看下面的示例 那就
  • 使用 sscanf 读取带空格的字符串

    对于一个项目 我试图从字符串中读取一个 int 和一个字符串 唯一的问题是sscanf 似乎打破了阅读 s当它看到一个空格时 有什么办法可以绕过这个限制吗 这是我正在尝试做的一个例子 include
  • 反序列化不一致的 JSON 属性

    希望有人可以帮助我解决我尝试使用 Newtonsoft Json 反序列化的大型 JSON 文件中出现的以下不一致问题 对象的属性之一有时会显示为 roles field1 value field2 value 而其他时候 相同的属性显示为
  • Ionic Framework/Cordova 上的 Google 地图不适用于 Android 构建

    我一直在为一个应用程序编写代码来跟踪用户位置并使用谷歌地图显示它 我的代码在浏览器 Safari Firefox Chrome 中完美运行 但在移动设备 android 上根本不起作用 谷歌地图 API 不起作用 导航也不可靠 我是一个离子
  • Discord 机器人如何处理来自多个服务器的事件

    我正在为我的服务器使用discord py 重写分支 开发一个discord 机器人 我需要邀请该机器人到多个服务器并同时使用它 我的问题是 我是否需要为每台服务器设置一个新线程 或者机器人是否对事件进行排队并一一处理它们 如果它确实对它们
  • 将文件作为输入流加载的不同方法

    有什么区别 InputStream is this getClass getClassLoader getResourceAsStream fileName and InputStream is Thread currentThread g
  • 选择不同...内连接与选择...其中 id in (...)

    我正在尝试创建表的子集 作为物化视图 定义为在另一个物化视图中具有匹配记录的记录 例如 假设我有一个包含 user id 和 name 列的用户表 以及一个包含entry id user id activity 和 timestamp 列的