我们需要确保只有一个特定过程的副本在 Oracle 中运行。如果它已经在运行并且用户试图打开另一个,那么它应该会出错。
这样做的最佳方法是什么?
我有另一个会话,我怀疑它没有在 Oracle 11gR2 中使用“正确”的 NLS 设置运行。我可以查询什么来显示不同活动会话的 NLS 设置 - 所有 NLS_* 视图都引用了我的当前会话。
我有一张表,其中计划的基数似乎太高了——尽管更新了统计数据,甚至尝试了 Oracle 11gR2 的动态采样。
select count(*)
from table1
where col1 = 123
and col2 = '1';
Run Code Online (Sandbox Code Playgroud)
col1 的一个值的估计基数大约为 29k,当它返回的实际行数为 637 时。对于另一个值,当实际行数为 67k 时,它的计划基数为 460k。一般来说,这会导致它选择非常糟糕的计划。
我试过更新统计信息:
exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1');
Run Code Online (Sandbox Code Playgroud)
或者
exec DBMS_STATS.gather_table_stats (ownname => 'ME', tabname =>'table1',estimate_percent =>100);
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 dynamic_samping (1-10) 的各种值,但没有任何改变它显着:
select /*+ dynamic_sampling(t1 10) */ count(*)
from table1 t1
where col1 = 123
and col2 = '1';
Run Code Online (Sandbox Code Playgroud)
dyanmic_sampling 会改变,但它仍然关闭近 50-100 倍。
我怎样才能得到更好的估计?
甲骨文 11g R2
不幸的是,我们的应用程序具有每行安全“功能”。我们有一个看起来像这样的查询:
坏,慢:
SELECT someRow, someOtherRow
FROM bigTableA a
WHERE EXISTS (
SELECT 0 FROM bigTableA_securitymapping b
WHERE b.PrimaryKeyTableA = a.PrimaryKeyTableA AND
b.accesscode in (SELECT accesscode
FROM accesscodeView
WHERE user = :someUserID)
)
Run Code Online (Sandbox Code Playgroud)
上有一个唯一索引bigTableA_securitymapping(PrimaryKeyTableA,accesscode)。
将accesscodeView有可能返回多个accesscode给定用户,所以它必须是IN()不=。
问题是此查询忽略了唯一索引bigTableA_securitymapping并选择执行全表扫描。
如果我将 the 更改IN()为 an=那么它会UNIQUE SCAN在唯一索引上执行 abigTableA_securitymapping并且大约快 50 倍。
好,快但不可能:
SELECT someRow, someOtherRow
FROM bigTableA a
WHERE EXISTS (
SELECT 0 FROM bigTableA_securitymapping …Run Code Online (Sandbox Code Playgroud) 我使用的是带有 2 节点 RAC 系统的 Oracle 11gR2。它与 EMC Clariion 共享光纤存储。
上周五事情变得很糟糕......快。多年来正常运行的所有突然过程变得非常非常缓慢。我注意到 log_file_sync 等待突然增加,并且 LGWR 进程被列为多个进程的阻止程序。我们所知道的那个星期五没有任何变化。此外,它似乎只是在一个节点上。
Statspack 报告确认 log_file_sync 等待时间从大约 1 毫秒变为 47 毫秒!另外 statspack 显示了这一点 - 这意味着其中一些正在等待很多:
Total ----------------- % of Waits ------------------
Event Waits <1ms <2ms <4ms <8ms <16ms <32ms <=1s >1s
-------------------------- ----- ----- ----- ----- ----- ----- ----- ----- -----
log file sync 100K .0 .3 1.7 9.0 25.4 31.0 32.4 .1
Run Code Online (Sandbox Code Playgroud)
而在此之前:
Total ----------------- % of Waits ------------------
Event Waits <1ms <2ms <4ms <8ms <16ms <32ms …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 oracle 的 IMPDP 工具完整地复制 SCHEMA。我已经设置了一个指向自身的数据库链接,并且该链接工作正常。然后我运行这个:
impdp username/password@instancename schemas=TARGET_SCHEMA
network_link=LINK_BACK_TO_TARGET
directory=HOME_DIR logfile=IMPDP_COPY_BACKUP.log
remap_schema=TARGET_SCHEMA:SOURCE_SCHEMA
TRANSFORM=STORAGE:n:table;
Run Code Online (Sandbox Code Playgroud)
在我的两个测试系统中一切正常,但在 Oracle 11gR2 生产中,它开始移动表并产生以下结果:
Processing object type SCHEMA_EXPORT/TABLE/TABLE
ORA-39126: Worker unexpected fatal error in
KUPW$WORKER.UPDATE_TD_BASE_PO_INFO [UPDATE
"ADMIN"."SYS_IMPORT_SCHEMA_04" mtu SET
mtu.base_process_order = NVL((SELECT mts1.process_order
FROM "ADMIN"."SYS_IMPORT_SCHEMA_04" mts1 WHERE
mts1.process_order > 0 AND mts1.duplicate = 0
AND mts1.object_schema = mtu.base_object_schema
AND mts1.object_name = mtu.base_object_name AND
mts1.object_type = mtu.base_object_type AND
mts1.processing_state != :1 ),
(-1000 - (SELECT MIN(mts2.process_order) FROM
"ADMIN"."SYS_IMPORT_SCHEMA_04" mts2 WHERE
mts2.process_order > 0 AND mts2.duplicate = 0 …Run Code Online (Sandbox Code Playgroud) 我们正在运行带有两节点 RAC 的 Oracle 11.2.0.3,而我们的 FRA 磁盘组空间不足。我需要通过 ASM 为其分配更多磁盘。我不知道该怎么做。我可以登录到一个节点并访问 asmcmd 或其他 asm 命令行实用程序。我需要做什么?
编辑:直到菲尔的回答才知道它是相关的:我们正在使用原始磁盘设备。
我运行了一个DBCC CHECKDB,它发现了分配错误。当我运行它时REPAIR_ALLOW_DATA_LOSS- 它是否需要花费相同的时间来扫描错误,还是会尝试使用CHECKDB我最后一次运行并运行得更快?
(SQL Server 2000。是的,它很古老,不,我无法升级。)
oracle ×7
dbcc-checkdb ×1
impdp ×1
locking ×1
oracle-asm ×1
performance ×1
plsql ×1
sql-server ×1
subquery ×1