我有一个分区表:SAMPLE_PARTITIONED_TBL基于PERIOD_ID数字字段(数据集:201001...201212.. 等等)有 60 个分区(没有子分区)。该表有几个本地索引,但由于某种原因,问题出在 PK 索引上。我在另一个模式中有相同的 DDL,它在那里工作正常。不确定 tio 寻找什么来解决这个问题。
我正在使用 Informatica(ETL 工具)将数据加载到该表中。在加载之前,我们会截断分区表:
SQL> ALTER TABLE owner_name.SAMPLE_PARTITIONED_TBL
2 TRUNCATE PARTITION SMPL_201001 DROP STORAGE;
Run Code Online (Sandbox Code Playgroud)
当加载开始时,我收到以下错误:
Message: Database errors occurred:
ORA-01502: index 'owner_name.SAMPLE_PARTITIONED_TBL_PK' or
partition of such index is in unusable state
Run Code Online (Sandbox Code Playgroud)
查看索引的状态...
SQL> select STATUS from all_indexes
2 where INDEX_NAME like 'SAMPLE_PARTITIONED_TBL_PK';
STATUS
--------
UNUSABLE
Run Code Online (Sandbox Code Playgroud)
现在在执行SQL> ALTER INDEX owner_name.SAMPLE_PARTITIONED_TBL_PK REBUILD;本地分区索引返回STATUS=VALID状态后,加载可以继续没有问题。
更新:
根据下面@Mat 的观察,我正在检查 PK 索引是否在本地分区:
SQL> select * from all_indexes where table_name = 'SAMPLE_PARTITIONED_TBL'; …Run Code Online (Sandbox Code Playgroud) 我正在搜索为什么 TRUNCATE 被放置在 DDL 而不是 DML 中的主题,我在这里找到了以下答案 Why is truncate DDL?
我这个答案我发现了一个句子如下
“TRUNCATE 不运行 ON DELETE 触发器这一事实也使其与正常的 DML 操作区分开来”
这与MYSQL 参考手册相冲突,其中说
“如果 FOREIGN KEY 约束指定 DELETE CASCADE,则子(引用)表中的行将被删除,并且截断的表将变为空。”
我正处于一种迷茫的状态。请详细说明这个问题。
谢谢
一个多星期前,我删除了 postgresql 表中的所有行(不是通过truncate,而是使用delete from ...)。Select count (*)显示表行现在为 0。
当我现在运行查询来查询磁盘空间时,我仍然看到该表占用了空间。具体来说,所有索引仍然存在并且正在占用空间。如何摆脱它们并释放磁盘空间?其次,当我摆脱了所有行时,为什么它们仍然留在首位?
以下是表格的详细说明,以防万一:
Table "public.links_photoobjectsubscription"
Column | Type | Modifiers
----------------+--------------------------+----------------------------------------------------------------------------
id | integer | not null default nextval('links_photoobjectsubscription_id_seq'::regclass)
viewer_id | integer | not null
updated_at | timestamp with time zone | not null
seen | boolean | not null
type_of_object | character varying(15) | not null
which_photo_id | integer |
which_link_id | integer |
which_group_id | integer |
which_salat_id | integer |
Indexes:
"links_photoobjectsubscription_pkey" …Run Code Online (Sandbox Code Playgroud) 我知道这可能看起来像一个奇怪的问题......
我有一个第三方数据库和服务,我想通过在DML触发器对其进行监视INSERT,UPDATE并且DELETE每个表的。
但是,唉,我在TRUNCATE TABLE被调用时遇到了问题,因为它没有激活DELETE触发器。
我正在寻找一种“重载”的方法TRUNCATE TABLE,例如:
DELETE FROM X; --remove all rows
TRUNCATE TABLE X; --truncate the empty table
Run Code Online (Sandbox Code Playgroud)
或者在截断之前激活一些 DDL 触发器,这样我就可以检查哪些行将被截断。
如果还有其他建议,我会很高兴。
这样的事情可能吗?
编辑
我不想禁用truncate我只想监视数据。
它是第 3 方数据库,并且被我无法控制的服务使用,因此我无法阻止truncate.
我只是想监视更改,目前无法跟踪由truncate命令引起的记录删除。
谢谢!
我目前有一个程序,通过创建临时表、填充表,然后将该数据合并到主表中来插入数据库。然后放下桌子并重新做一遍。我想知道如果我只是截断而不是删除和创建,速度差异是多少。
我们有一个Truncate Table在 Snapshot 事务中运行的 proc 。这似乎导致了一个LOCK_M_S阻塞 sys 视图的锁sys.partitions。
有没有方便的解决方法?我喜欢不使用 truncate 发生的多余日志的效率,但不想锁定我的sys.partitions.
我很高兴应要求发布代码,但我很确定这是Truncate在 Snapshot 事务中的某种行为。我只是不知道。
我有一个相当大的表,可能有 50M 行,我不得不截断它。通常 truncate 非常快,但在这种情况下需要几个小时才能完成。有哪些因素会导致truncate命令无法正常运行?
假设我有一个parent由子表引用的父表child。该表parent已填充但未填充child。试图截断parent结果
ORA-02449: unique/primary keys in table referenced by foreign keys
Run Code Online (Sandbox Code Playgroud)
有没有办法向child空的 DBMS 提示,以便不需要禁用外键约束?
我想知道:我们的 MS SQL Server 2012 上有一个数据库。恢复模式是“简单”的。
数据库本身大约有 2.7GB 大。我配置了 Trn-Log 的最大大小 (3GB)。
现在我用“重新组织索引任务”-->“更新统计”制定了一个维护计划。
奇怪的是,当我运行维护计划时,“简单”模式下的数据库日志会随着 3GB 的归档而增长,并且出现错误...
为什么即使在简单模式下也使用 Trn-Log?为什么 3 GB 似乎还不够?
我正在阅读这98-364 exam本书,但有一个问题我无法完全回答:
“您将使用什么命令从 Contact 表中删除所有没有美国国家/地区的记录,同时释放这些记录使用的空间?”
如果“没有美国的国家”不在那里,那么它只是“截断命令”,因为它会清除该表中的所有数据,并释放空间。据我所知,删除命令不会释放空间,而且我找不到在针对特定记录的同时删除和释放空间的命令。
这本书在这里有错别字吗?或者有没有人知道的命令?
注意:它是“什么命令...”,而不是命令。
编辑:(斯图尔特)这里有很多有用的答案,在我看来,这本书有些含糊不清。在“你会使用哪个命令”之外,如果考试中出现这种情况,“预期”答案是什么?我假设他们正在寻找“带有 where 子句的删除命令”。仅仅因为他们到目前为止,书中只建议了三种方法(删除/截断/删除)。
truncate ×10
sql-server ×5
delete ×2
postgresql ×2
alter-table ×1
benchmark ×1
ddl ×1
drop-table ×1
index ×1
mysql ×1
mysql-5.0 ×1
oracle ×1
oracle-11g ×1
partitioning ×1
trigger ×1