我在 Oracle 11 中的删除速度非常慢。这些表由外键链接,每个外键约束都设置了删除级联。
如果我在这样的语句上点击解释按钮,即使涉及 30 个其他表,DELETE FROM TOP_LEVEL_TABLE WHERE SOMETHING = 'whatever'
它也只会显示我的参与。TOP_LEVEL_TABLE
我怎样才能得到更真实的结果?
我在 Oracle 11 中的删除速度非常慢。这些表由外键链接,每个外键约束都设置了删除级联。
如果我在这样的语句上点击解释按钮,即使涉及 30 个其他表,DELETE FROM TOP_LEVEL_TABLE WHERE SOMETHING = 'whatever'
它也只会显示我的参与。TOP_LEVEL_TABLE
我怎样才能得到更真实的结果?
我的问题针对 Postgres,但来自任何数据库背景的答案可能就足够了。
我的假设是否正确:
设置系统时最好将所有块都设置为 8k?还是设置不重要?我还想知道一些“错误”的块大小设置是否会在崩溃时危及数据完整性?也许如果必须将 Postgres 8k 块拆分为多个磁盘块?
或者没有任何东西被批处理在一起,因此我会因为定义的块大小之间的每一次不匹配而失去磁盘空间?
我正在设置一个 Postgres 9.1 主服务器和一个热备用服务器。我阅读了文档,但我不太确定我应该如何处理我的 WAL 文件。
每次提交都在返回到应用程序之前在两个服务器上完成,因此将 WAL 归档到某些第三方系统接缝上是无用的。但是想象一下我的热备份服务器出现故障,那么我将不得不手动重新配置主实例而不使用任何备用服务器。只有这样才激活 WAL 存档是否明智?
我想不会,因为新创建的 WAL 对任何新设置的热备份都是无用的。我是否应该始终让 WAL 存档处于活动状态,并且不时对正在运行的系统进行完整的快照备份,然后根据时间戳手动删除旧的存档 WAL?那么如果当前的热备实例发生故障,我可以快速建立一个新的热备实例吗?或者让一个新的热备用服务器赶上每个 TCP 连接是否更好,因为它对数据库进行一些高吞吐量的批量传输,并且只在它接近最新时才切换到重放流 WAL?这会很棒,因为那样我就根本不必关心 WAL 归档了?
如果写入数据库在几个小时内不起作用我不在乎,只有读取必须具有高可用性。
编辑:我还对有关新的热备用如何赶上主数据库的一些细节感兴趣。是在交易中完成所有事情还是涉及一些高速 TCP 追赶,这类似于(在运行时复杂性方面)仅复制磁盘。
我想知道一个奇怪的死锁,在检查了所有其他组件后,我认为它是 Oracle 11.2 中的一个 INITRANS 问题。
现在出现了三个问题:
有什么方法可以分析块有多满?
我的数据库不久前达到了其最大表空间大小并开始拒绝插入,然后我添加了另一个数据文件,但只有在几乎所有空间都用完时才会增长。我的 PCT_USED 是 96%。我的假设是否正确,即所有数据块都将被完全塞满并且很可能出现 INITRANS 死锁?
有没有办法在死锁跟踪中看到 INITRANS 问题?
我也很高兴得到部分答案。
我想知道会话或事务何时开始。死锁文件没有给我这个信息。是否有一些日志文件保存这些记录?
我有一个事务 ID“TX-1234-abcd”、一个会话编号和一些“DID 000-000ABCD”编号。
我想合并两个实际上处于分层星座中的表。
我将如何用关系代数来写它?假设表 A 是 1:n 关系中 B 的父表。
首先,我在 A 上进行选择,然后我只想与 B 中的这些条目建立联合,这些条目将与 A 上的选择连接。
我想以数据库评估它的方式编写它。
有条件结合这样的东西吗?
我试图了解为什么我的数据库会出现死锁。跟踪告诉我同一张表上的两个更新正在锁定。In table 是事务中要写入的第一个表,之前只发生了一些读取。更新/插入以批处理方式完成。也用于标识要更新的行的键使用 b+-tree 进行索引。该键在其他表中也充当外键。在这些其他表中,外键允许为空。
应用程序不允许包含可能冲突的并行事务。
这是跟踪文件的头:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-134b0012-3201376f 65 185 X 33 392 S
TX-13495007-50f092d1 33 392 X 65 185 S
session 185: DID 0001-0012-04533045 session 392: DID 0001-0023-03401G5A
session 392: DID 0001-0023-03401G5A session 185: DID 0001-0012-04533045
Rows waited on:
Session 588: no row
Session 497: no row
在将键作为外键引用的表中插入空值会导致某种表扫描(不这么认为)吗?批量插入/更新可能会导致索引的更大分支被锁定吗?也许 T1 得到了树的一些左分支,而 T2 得到了右分支,现在 T1 想要在右分支中插入/更新一个值,但右分支仍然被 T2 锁定,T" 然后从左侧请求一些东西? 我不知道Oracle 中是否以及如何实现多粒度锁定,但如果有人能排除这一点,那就太好了。
即使事务在逻辑上是 100% 分离的,Oracle 是否有可能允许死锁?
我可以寻找什么?访问索引有问题吗?
PS:已设置读取已提交。
我有一个 RAID10 服务器并让 Postgres 将日志(pg_xlog aka WAL)写入同一个 RAID10 阵列。
我在同步模式下使用带有大缓冲区的 WAL,并进行大量批量插入和更新,因此希望使用该缓冲区。
将日志拆分到一个额外的磁盘上,而不是在 raid10 中是个好主意吗?我可以用 2 个磁盘填充 RAID,但这真的能改善什么吗?
我期待有人能说出一些优点和缺点。
我正在使用 Oracle 11.1,并想弄清楚一个表中的两行是否由同一事务插入。
是否有一个简单的 sql 语句可以将一行映射到一个事务 id?该表是仅插入表。
我有哪些选择?一些 baisc 解决方案可以,我真的不想要一些额外的工具来分析日志文件。
谢谢