2008-12-19 147 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不是確定性函數,那麼這可能導致錯誤的結果,所以要小心!