【发布时间】:2019-06-21 16:02:04
【问题描述】:
我有一个查询在运行时运行得非常好(快速),但是一旦我尝试通过串联值进行搜索,性能就会下降。
为了保持高性能,我有哪些选择?我知道显而易见的解决方案是不通过连接的字符串进行搜索,但是在某些情况下我不得不这样做。我该如何处理这些情况。
示例 1:快速运行
Select * From
(
With Exmp1 AS
(
Select ID, RCD From Table1 a where EFFDT = (Select Max(b.EFFDT)
FROM Table1 b
Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
)
Select USERNAME, RCD
From MainTable MT Inner Join Exmp1 E1 ON MT.ID = E1.ID
)
Where USERNAME = 'test1'
示例 2:运行缓慢
Select * From
(
With Exmp1 AS
(
Select ID, RCD From Table1 a where EFFDT = (Select Max(b.EFFDT)
FROM Table1 b
Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
)
Select USERNAME || '@domain.com', RCD
From MainTable MT Inner Join Exmp1 E1 ON MT.ID = E1.ID
)
Where USERNAME = 'test1@domain.com'
如果您想知道为什么我将整个查询包装在一个 select 中,那么使用此查询的应用程序期望查询以“Select”开头。我已经尝试在没有“with”子句的情况下重新编写它,但我得到了相同的结果。
Select USERNAME || '@domain.com', RCD
From MainTable MT Inner Join
(Select ID, RCD
From Table1 a
Where EFFDT = (Select Max(b.EFFDT) FROM Table1 b Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
) E1 ON MT.ID = E1.ID
Where USERNAME|| '@domain.com' = 'test1@domain.com'
============ 编辑附加信息:
Table1 有四列:ID、RCD、EFFDT、STATUS。重要的是,我只获取最新记录 (EFFDT) 和状态值为“A”的记录。
主表有两列:ID、USERNAME。我无法更改此表或创建其他表、数据库视图。我必须使用目前存在的这些数据,并且只能以 SQL 查询的形式进行交互。
所需的结果是 USERNAME@domain.com 和给定 USERNAME@domain.com 的 RCD。
请注意,这只是一个具体示例,我们非常感谢您提供有关该主题的一般帮助。
【问题讨论】:
-
你能给出一些样本数据和他们想要的结果吗?
-
我总是得到正确的数据输出,所以我并不担心,但如果有帮助,我会用一些额外的数据更新帖子。
-
使用物化视图可能是一个不错的选择或生成列
-
请列出
Table1和MainTable拥有的所有索引。 -
那些搜索连接值的子句总是相同的吗?否则使用物化视图或生成的列也没有多大意义。理想情况下,请参阅 Why should I provide a Minimal Reproducible Example for a very simple SQL query? 以提供示例数据和预期结果。理想情况下,我们还需要有
CREATE TABLE语句,以便我们知道数据类型和索引。
标签: sql oracle performance