我有一个数据库,其中有几个 BLOB 列分散在多个表中。由于我是一名开发人员,并且正在考虑使应用程序代码编写更容易,因此我想将这些列转换为 NUMBER FK 列,引用一个专用于 BLOB 的表(即一个 PK ID 列和一个 BLOB 列)。这将允许我们的 ORM 库以更少的代码更轻松地进行对象的延迟初始化。
这样做对性能或数据组织有何影响?由于这些 BLOB,数据库的大小相当大。
我有一个数据库,其中有几个 BLOB 列分散在多个表中。由于我是一名开发人员,并且正在考虑使应用程序代码编写更容易,因此我想将这些列转换为 NUMBER FK 列,引用一个专用于 BLOB 的表(即一个 PK ID 列和一个 BLOB 列)。这将允许我们的 ORM 库以更少的代码更轻松地进行对象的延迟初始化。
这样做对性能或数据组织有何影响?由于这些 BLOB,数据库的大小相当大。
在 Oracle 11g 中,我们使用XMLELEMENT
从表中获取记录。然而,问题似乎是,我们正在调用SELECT XMLELEMENT(...).getClobVal() from DUAL;
哪个正在像三明治一样吃掉我们的临时表空间。
我读到我们可以使用 杀死 blob 记录FREETEMPORARY(blob_ref)
,但在上面显示的格式中,我们没有引用 blob。有什么办法可以得到一个吗?
因为这是从一个程序运行的,而且我们使用的库为我们生成了 PL/SQL 块,所以它真的不能重组为 PL/SQL 语句。
DBCP 是我们与 Tomcat 一起使用的连接池,而 Spring 的 JdbcTemplate 是我们用来运行查询的。考虑到 JdbcTemplate 为我们交换了绑定变量,我们假设它正在幕后创建一个匿名块。
运行select * from v$temporary_lobs;
显示,对于当前会话,我的列中仍有 4 个ABSTRACT_LOBS
。这是在 SQL Developer 中自行运行查询(无匿名块)四次之后的结果。
我有一组需要连续运行的查询,将上一个查询的结果带到下一个查询中。我唯一需要的是列表中最后一个查询的执行时间,但SET TIMING ON
给了我整个块的执行时间。知道如何获得最后一次查询的时间吗?牛肉是我不希望以前的查询干扰它给我的时间。下面的例子:
set echo on;
set feedback on;
set timing on;
set serveroutput on;
declare
pid varchar(20);
aid varchar(20);
bob char(1);
begin
select st.some_id, st.person_id into aid, pid
from some_table st
join person p on st.person_id = p.person_id
where p.name not like '%bob%' and rownum = 1;
-- get timing of another query here
end;
当我运行它时,它给了我代码块的总执行时间:
Elapsed: 00:00:00.045
我有一个我很好奇的索引(从很久以前开始)。它在基本人员表上,功能是
upper("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME")
当尝试搜索该索引时,我以全表扫描结束。知道为什么吗?如果这就像我认为的那样完全被破坏了,你会建议在这四个列上使用列索引吗?
编辑
很抱歉没有提供查询。是的,查询是一样的,列都是可以为空的。所以我有
select *
from person p
where UPPER("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME")
like replace(upper('<search string here>'), '*', '%') || '%'
有什么想法吗?感谢你及时的答复。
我有一个看起来像这样的表:
+---------------------------------------------+
| EVENT_ID | ITEM_ID | PERSON_ID | EVENT_DATE |
+---------------------------------------------+
| 123 | 1 | 2 | 21-AUG-03 |
| 124 | 1 | 3 | 22-AUG-03 |
| 125 | 1 | 45 | 23-AUG-03 |
| 126 | 1 | (null) | 24-AUG-03 |
| 127 | 2 | 2 | 25-AUG-03 |
| 128 | 2 | 6 | 26-AUG-03 |
| 129 | 2 | 1 | 27-AUG-03 |
+---------------------------------------------+
因此,我需要为每个 item_id 获取最新的 (MAX(event_date))、非空 person_id。我们为此提出了一种相当简单的 PL/SQL 方法,但试图用直接的 SQL 来完成这项工作。有人有想法吗?
顺便说一句,event_id 并不总是像这样连续。我们有两个冗余的数据库服务器。
提前谢谢。