标签: oracle-10g

Oracle - 有什么方法可以查看对特定表的未提交更改吗?

我目前正在通过批处理进行调试,该批处理执行大量 DML 语句,但不会立即执行提交。能够在事务未提交的情况下查看来自另一个会话的“待处理”更改会很好。这可能吗?

例子:

Insert into table myTable (col1, col2) values ("col1", "col2");

--Somehow view the pending transaction maybe by system view?....

...other DML statements....

commit;
Run Code Online (Sandbox Code Playgroud)

oracle oracle-10g transaction

25
推荐指数
5
解决办法
4万
查看次数

如何在 Oracle 中声明和使用变量?

我的主要技能是使用 SQL Server,但有人要求我对 Oracle 查询进行一些调整。我编写了以下 SQL:

declare @startDate int
select @startDate = 20110501
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

declare @startDate int
select @startDate = 20110501
Error at line 1
ORA-06550: line 1, column 9:
PLS-00103: Encountered the symbol "@" when expecting one of the following:

   begin function package pragma procedure subtype type use
   <an identifier> <a double-quoted delimited-identifier> form
   current cursor
Run Code Online (Sandbox Code Playgroud)

如何在 Oracle 中声明和使用变量?

oracle syntax oracle-10g

20
推荐指数
2
解决办法
22万
查看次数

复合索引:最具选择性的列优先?

我一直在阅读composite indexes有关订购的信息,但我有点困惑。这个文档(不到一半)说

通常,您应该将最常使用的列放在索引中。

然而,不久之后它说

创建一个组合索引,将最具选择性的列放在首位;也就是说,具有最多值的列。

换句话说,Oracle 也在这里

如果所有键在 WHERE 子句中的使用频率相同,则在 CREATE INDEX 语句中将这些键从选择性最高到选择性最低的顺序最能提高查询性能。

但是,我发现了一个不同的答案。它说

将选择最少的列排在最前面,将选择最多的列排在最后。在与列有联系的情况下,更有可能单独使用。

我引用的第一个文档说你应该首先使用最常用的,而 SO 答案说这应该只用于打破平局。然后他们在订购上也有所不同。

文档还谈到skip scanning并说

如果复合索引的前导列中的不同值很少,而索引的非前导键中有许多不同的值,则跳过扫描是有利的。

一篇文章

前缀列应该是最有辨别力,在查询中使用最广泛的

我认为最有辨别力的就是最独特的。

所有这些研究仍然让我想到同样的问题;最具选择性的列应该是第一个还是最后一个?第一列是否应该是抢七局中使用最多且最具选择性的列?

这些文章似乎相互矛盾,但它们确实提供了一些示例。从我收集的,它似乎是更有效的least selective column第一个在订购,如果你正期待Index Skip Scans。但我不确定这是否正确。

oracle oracle-10g

20
推荐指数
2
解决办法
9415
查看次数

不能删除不存在的约束,也不能创建它

在使用生产数据的副本测试一些迁移脚本(脚本与开发数据一起运行良好)时,我发现了一个奇怪的情况。CONSTRAINT 已更改,因此我发出 DROP + ADD 命令:

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;
Run Code Online (Sandbox Code Playgroud)

DROP 命令运行良好,但 ADD 命令失败。现在,我陷入了一个恶性循环。我无法删除约束,因为它不存在(初始删除按预期工作):

ORA-02443: 无法删除约束 - 不存在的约束

我无法创建它,因为名称已经存在:

ORA-00955: 名称已被现有对象使用

A_DUP_CALLE_UK1在 SQL Developer 的搜索框中输入内容,然后……就在那里!所有者、表名、表景观……一切都匹配:它不是同名的不同对象,它我的原始约束。该表出现在约束详细信息中,但该约束未出现在表的详细信息中。

我的问题:

  • 对此有何解释?
  • 当我在实时服务器中进行真正的升级时,如何确保它不会发生?

(服务器是 10g XE,我没有足够的声望来创建标签。)

oracle oracle-10g oracle-xe

19
推荐指数
3
解决办法
5万
查看次数

为什么 Oracle 会话在处于非活动状态两周后仍然有效

数据库:Oracle 10g

操作系统:Windows Server 2003 64 位

我查询 Web 应用程序生成的 Oracle 会话列表(按 program=w3wp.exe 过滤)

select * from V$session
where UPPER(program) LIKE '%W3%'
order by logon_time
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

根据 Logon_Time,为什么 31/07/2012 或 01/08/2012 或今天(21/08/2012)之前的任何会话仍然活动?

我在 sqlnet.ora 上配置了: SQLNET.EXPIRE_TIME= 20 所以这意味着每 20 分钟 Oracle 都会检查连接是否仍然处于活动状态。

所有用户架构都有默认配置文件。这意味着没有会话永远不会过期或死亡?

在此处输入图片说明

在回复 Phil 的评论时添加:

在此处输入图片说明

添加响应 Phil 的回答:

在此处输入图片说明

oracle oracle-10g

16
推荐指数
1
解决办法
8万
查看次数

对多个查询列使用相同的 CASE WHEN 条件

是否有“更好”的方法来重写SELECT多个列使用相同CASE WHEN条件的子句,以便条件只检查一次?

请参阅下面的示例。

SELECT
    CASE testStatus 
        WHEN 'A' THEN 'Authorized'
        WHEN 'C' THEN 'Completed'
        WHEN 'P' THEN 'In Progress'
        WHEN 'X' THEN 'Cancelled'
    END AS Status,

    CASE testStatus 
        WHEN 'A' THEN authTime
        WHEN 'C' THEN cmplTime
        WHEN 'P' THEN strtTime
        WHEN 'X' THEN cancTime
    END AS lastEventTime,

    CASE testStatus 
        WHEN 'A' THEN authBy
        WHEN 'C' THEN cmplBy
        WHEN 'P' THEN strtBy
        WHEN 'X' THEN cancBy
    END AS lastEventUser
FROM test
Run Code Online (Sandbox Code Playgroud)

在非 sql 伪代码中,代码可能如下所示:

CASE testStatus
    WHEN …
Run Code Online (Sandbox Code Playgroud)

oracle database-design best-practices oracle-10g

14
推荐指数
2
解决办法
10万
查看次数

在oracle sql查询中创建增量数

如何在不创建任何表的情况下在oracle sql查询中创建增量数?我曾尝试使用“with”子句,但没有得到预期的结果。我正在使用 oracle 10g

这是我尝试的代码,它似乎不起作用:

WITH
TABLE3 AS ( SELECT 2008 YEARS FROM dual WHERE 1=1
union all
select t3.YEARS+1 from TABLE3 t3
WHERE 1=1 AND t3.YEARS < 2011
)

select YEARS from TABLE3
Run Code Online (Sandbox Code Playgroud)

我想要的预期结果是:

2008
2009
2010
2011
Run Code Online (Sandbox Code Playgroud)

oracle-10g

13
推荐指数
3
解决办法
10万
查看次数

如何在 Oracle 中的表上找到索引占用的实际空间?

我想找到 oracle 10g 中表上的索引消耗的实际空间。我不打算包括 oracle 保留的空间以供将来使用。(不应该考虑oracle 的开销。)我想要使用的字节而不是分配的字节。

你能帮我继续前进吗?

另外,有没有办法找到表中长字段的实际大小。

PS:vsize() 和 dbms_lob.getlength() 不起作用。

oracle oracle-10g

12
推荐指数
2
解决办法
6万
查看次数

跟踪、调试和修复行锁争用

晚了,我一直面临着很多行锁争用。争用的表似乎是一个特定的表。

一般是这样的——

  • 开发人员 1 从 Oracle Forms 前端屏幕启动事务
  • 开发人员 2 从使用同一屏幕的不同会话开始另一个事务

大约 5 分钟后,前端似乎没有响应。检查会话显示行锁争用。每个人都抛出的“解决方案”是终止会话:/

作为数据库开发人员

  • 可以做些什么来消除行锁争用?
  • 是否有可能找出存储过程的哪一行导致这些行锁争用
  • 减少/避免/消除编码问题的一般准则是什么?

如果这个问题感觉过于开放/信息不足,请随时编辑/让我知道 - 我会尽力添加一些额外的信息。


有问题的表有很多插入和更新,我想说它是最繁忙的表之一。SP 相当复杂 - 为简化起见 - 它从各种表中获取数据,将其填充到工作表中,在工作表上发生大量算术运算,并将工作表的结果插入/更新到相关表中。


数据库版本为 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit。逻辑流在两个会话中以相同的顺序执行,事务不会保持打开太长时间(或者至少我认为是这样),并且在事务的主动执行期间发生锁定。


更新:表格行数比我预期的要大,大约有 310 万行。此外,在跟踪会话后,我发现该表的几个更新语句没有使用索引。为什么会这样 - 我不确定。where 子句中引用的列已编入索引。我目前正在重建索引。

oracle-10g locked-objects locking

12
推荐指数
3
解决办法
2万
查看次数

Oracle 数据库中的提交与快速提交与提交清除

我想知道是否有人可以验证我对这 3 个与 Oracle 数据库相关的术语之间差异的理解。

许多来源混淆了这些术语并且没有详细解释它们,因此查找信息有点困难。

从我收集到的:

  1. 提交和快速提交是一回事,所有提交都是快速提交。
  2. 快速提交本质上仅更新撤消/回滚段标头的事务表中的标志以指示事务已提交。然而,实际块没有被重新访问,这意味着位于数据块头部的感兴趣事务列表(ITL)中的撤消字节地址(UBA)仍然指向相应撤消段的事务表。此外,相应行的锁字节不会被释放,并且 ITL 中的锁计数不变(行仍然被锁定)。
  3. 在一个提交清除,块重新与ITL与提交SCN更新。然而,ITL 中的锁计数和每行存储的锁字节仍然没有更新(行仍然被锁定,就像在快速提交中一样),即使块被更改,这也不会生成重做。
  4. 正常提交的块(== 快速提交)将在下次触摸时进行延迟块清除(并生成重做)。
  5. 进行了提交清除的块将在下次触摸时进行延迟日志记录块清除(并生成重做)。

希望有人可以验证这些要点!谢谢!

rdbms oracle oracle-11g-r2 oracle-11g oracle-10g

12
推荐指数
1
解决办法
4657
查看次数