2008-12-19 92 views

回答

1

问:如何调用存储与光标从TOAD?

答:例如,更改到你的光标,包名和存储过程的名称

declare cursor PCK_UTILS.typ_cursor; 

begin 
    PCK_UTILS.spc_get_encodedstring( 
     'U', 
     10000002, 
     null, 
     'none', 
     cursor); 
end; 
+0

这看起来很酷。但我没有完全理解它。你是否在说如果你有一个返回引用游标的过程,你很难在Toad中显示它? – 2008-12-23 17:16:52

+0

是的! 使用此代码,您可以调用与参考光标一起存储为输出。 也许你可以在下一步很容易地循环记录,以及... – 2009-01-06 21:36:31

2

Snapshot表。也可以在Oracle Lite中找到,并且非常适用于您自己的复制机制。

+0

你的意思是物化视图吗? – jle 2010-03-26 19:12:54

+0

如果您将物化视图移至其他数据库并添加一种机制以跟踪其中发生的所有更改(添加,更新和删除),然后在原始源中重新生成所有这些更改,则物化视图将成为快照表数据库。 – MusiGenesis 2010-03-26 23:58:45

15

由于顶点现在是每一个Oracle数据库的一部分,这些顶级的实用功能是有用的,即使你不使用的Apex:

SQL> declare 
    2 v_array apex_application_global.vc_arr2; 
    3 v_string varchar2(2000); 
    4 begin 
    5 
    6 -- Convert delimited string to array 
    7 v_array := apex_util.string_to_table('alpha,beta,gamma,delta', ','); 
    8 for i in 1..v_array.count 
    9 loop 
10  dbms_output.put_line(v_array(i)); 
11 end loop; 
12 
13 -- Convert array to delimited string 
14 v_string := apex_util.table_to_string(v_array,'|'); 
15 dbms_output.put_line(v_string); 
16 end; 
17/
alpha 
beta 
gamma 
delta 
alpha|beta|gamma|delta 

PL/SQL procedure successfully completed. 
+0

我喜欢这两个函数:已经看到我们的dbas和stored-proc-devs串联字符串很多次... – 2008-12-19 23:51:00

3

绕过缓冲区高速缓存并使用直接路径读取磁盘读取直。

alter session set "_serial_direct_read"=true; 

导致表空间(9i)或快速对象(10g +)检查点,所以在繁忙的OLTP系统上要小心。

9

基数提示大多是无证的。

explain plan for 
select /*+ cardinality(@inner 5000) */ * 
from (select /*+ qb_name(inner) */ * from dual) 
/
select * from table(dbms_xplan.display) 
/
-------------------------------------------------------------------------- 
| Id | Operation   | Name | Rows | Bytes | Cost (%CPU)| Time  | 
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |  | 5000 | 10000 |  2 (0)| 00:00:01 | 
| 1 | TABLE ACCESS FULL| DUAL |  1 |  2 |  2 (0)| 00:00:01 | 
-------------------------------------------------------------------------- 
+0

即使QB_name很酷 – 2008-12-23 17:12:44

+0

基数也是一个很好的提示,因为它通常会修复您的计划的其余部分,在未来很容易理解。 – 2008-12-28 08:39:46

+0

基数提示对表格功能来说很关键* amolinaro在这里下了一些知识:http://www.lazydba.com/oracle/0__116173.html – jimmyorr 2009-04-23 21:09:56

12

“全表扫描并不总是坏事。指标并不总是好的。”

当您按照每个工作单元访问的行(通常是每个逻辑读取)对其进行测量时,基于索引的访问方法在读取行时效率低于完整扫描。然而,许多工具将解释全表扫描作为效率低下的标志。

举一个例子,您正在阅读发票表的几百张发票,并在小型查找表中查找付款方式。使用索引来查找每张发票的查找表可能意味着每张发票三到四个逻辑io。然而,为了准备发票数据的散列连接而对查找表进行全面扫描可能仅需要几次逻辑读取,并且散列连接本身几乎不需要任何成本就可以在内存中进行累积。

然而,许多工具会看这个,并看到“全表扫描”,并告诉你尝试使用索引。如果你这样做,那么你可能只是调整你的代码。

顺便提及,过度依赖索引(如上例所示)会导致“缓冲区高速缓存命中率”升高。这就是为什么BCHR作为系统效率的预测因素大部分是无稽之谈。

+0

更多信息请... – 2008-12-23 14:03:28

+0

编辑包含更多详情 – 2008-12-23 17:39:57

5

我刚刚发现了关于伪列的Ora_rowSCN。如果您没有为此设置您的表格,则此列会为您提供块SCN。这可能对紧急情况非常有用,“哦,废话我没有在这张桌子上审计,并想知道是否有人从昨天起改变了数据。”

但更好的是,如果您创建RowDependecies ON的表。这使SCN在每一行上都发生了最后的变化。这将帮助您避免“丢失编辑”问题,而无需在查询中包含每一列。

IOW,当你的应用程序抓取一行用户修改时,也选择Ora_rowscn。然后,当您发布用户的编辑时,除了where子句中的唯一键外,还应包含Ora_rowscn = v_rscn。如果某人在抓取该行后触摸了该行,即aka丢失了编辑,则该更新将匹配零行,因为ora_rowscn已更改。

太酷了。

8

的缓存命中率是系统效率的预测毫无意义

7

指标的频繁重建几乎总是浪费时间。

8

您可以使用闪回查询自上次查看表数据,但有一定的局限性。

Select * 
    from my_table as of timestamp(timestamp '2008-12-01 15:21:13') 

11g有一个全新的功能,可以更有力地保留历史变化。

2

@Peter

实际上,你可以蟾蜍类型的变量“光标”进行绑定,然后在语句中使用它,它会显示在结果网格中的结果。

exec open :cur for select * from dual; 
4

如果你得到DBA_USERSPASSWORD列的值,你可以备份/恢复密码不知道他们:

ALTER USER xxx IDENTIFIED BY VALUES 'xxxx'; 
3

我不知道这是否算作隐藏的,但我很高兴当我看到这种方式很快看到你正在调整的SQL语句发生了什么。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL; 

SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL, NULL, 'RUNSTATS_LAST')) 
; 

PLAN_TABLE_OUTPUT 
----------------------------------------------------- 
SQL_ID 5z36y0tq909a8, child number 0 
------------------------------------- 
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL 

Plan hash value: 272002086 

--------------------------------------------------------------------------------------------- 
| Id | Operation   | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | 
--------------------------------------------------------------------------------------------- 
| 1 | TABLE ACCESS FULL| DUAL |  1 |  1 |  1 |00:00:00.02 |  3 |  2 | 
--------------------------------------------------------------------------------------------- 


12 rows selected. 

其中:

  • E-行估计行。
  • A行是实际行。
  • A-Time是实际时间。
  • 缓冲区是实际的缓冲区。

如果估计的计划与实际执行相差数量级,那么您知道您有问题。

3

不是一个隐藏的功能,但Finegrained-Access-Control(FGAC)也称为行级安全性,这是我过去使用过的,它的实现效率给我留下了深刻的印象。如果您正在寻找可确保您可以控制行向具有不同权限的用户的暴露方式的粒度,而不管用于查看数据的应用程序(SQL * Plus以及Web应用程序)如何 - 那么这是一个宝石。

内置的全文索引有更广泛的文档记录,但由于其稳定性(只是尝试在MS-SQL和Oracle的类似数据样本上运行全文索引列的重新索引,您会看速度差异)。

7

wm_concat作品像MySQL的GROUP_CONCAT但没有证件。

数据:

-car- -maker- 
Corvette Chevy 
Taurus Ford 
Impala Chevy 
Aveo  Chevy 

select wm_concat(car) Cars, maker from cars 
group by maker 

为您提供:

-Cars-     -maker- 
Corvette, Impala, Aveo Chevy 
Taurus     Ford 
1

字符串聚集WM_CONCAT

1

Scalar subquery caching是最令人吃惊的特征之一,甲骨文

-- my_function is NOT deterministic but it is cached! 
select t.x, t.y, (select my_function(t.x) from dual) 
from t 

-- logically equivalent to this, uncached 
select t.x, t.y, my_function(t.x) from t 

上面的“缓存”子查询仅对t.x的每个唯一值评估my_function(t.x)。如果您拥有相同t.x值的大分区,这将极大地加快您的查询速度,即使my_function而不是宣称为DETERMINISTIC。即使它是DETERMINISTIC,您也可以安全地处理一个可能很贵的SQL - > PL/SQL上下文切换。

当然,如果my_function不是确定性函数,那么这可能导致错误的结果,所以要小心!