24

我喜欢关于sql server 中隐藏功能的答案和问题

关于甲骨文,您能告诉我们什么?
隐藏的表,......的内部工作原理,秘密存储的过程,具有良好实用程序的包......

4

21 回答 21

15

由于 Apex 现在是每个 Oracle 数据库的一部分,即使您不使用 Apex,这些 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.
于 2008-12-19T15:57:17.410 回答
12

“全表扫描并不总是坏的。索引并不总是好的。”

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

举个例子,你正在从一个发票表中读取几百张发票,并在一个小的查找表中查找一种付款方式。使用索引来探测每张发票的查找表可能意味着每张发票需要三个或四个逻辑 io。然而,为从发票数据中进行散列连接而准备的查找表的完整扫描可能只需要几次逻辑读取,并且散列连接本身将在内存中完成,几乎没有任何成本。

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

顺便说一下,如上例所示,过度依赖索引会导致“Buffer Cache Hit Ratio”上升。这就是为什么 BCHR 作为系统效率的预测指标大多是无稽之谈。

于 2008-12-19T17:34:33.673 回答
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 |
 --------------------------------------------------------------------------
于 2008-12-19T17:32:30.587 回答
8

Buffer Cache Hit Ratio 作为系统效率的预测指标几乎没有意义

于 2008-12-23T17:40:19.727 回答
8

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

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

11g 具有一个全新的功能集,可以更稳健地保存历史更改。

于 2008-12-23T17:43:28.113 回答
7

频繁重建索引几乎总是浪费时间。

于 2008-12-23T17:40:58.930 回答
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
于 2010-03-26T19:10:43.460 回答
6

OVERLAPS 谓词未记录在案。

http://oraclesponge.wordpress.com/2008/06/12/the-overlaps-predicate/

于 2008-12-19T17:33:08.167 回答
5

我刚刚发现了伪列 Ora_rowSCN。如果您不为此设置表格,则此 pcolumn 将为您提供块 SCN。这对于紧急情况非常有用,“哦,废话,我没有对这张表进行审计,想知道是否有人从昨天开始更改了数据。”

但更好的是,如果您在 Rowdependecies ON 的情况下创建表。这会将最后一次更改的 SCN 放在每一行上。这将帮助您避免“丢失编辑”问题,而不必在查询中包含每一列。

IOW,当您的应用抓取一行进行用户修改时,还要选择 Ora_rowscn。然后,当您发布用户的编辑内容时,除了 where 子句中的唯一键之外,还包括 Ora_rowscn = v_rscn。如果有人在您抓取后触摸了该行,也就是丢失了编辑,则更新将匹配零行,因为 ora_rowscn 将发生变化。

非常酷。

于 2008-12-23T17:25:11.973 回答
4

如果您获得PASSWORDcolumn 的值,DBA_USERS您可以在不知道密码的情况下备份/恢复密码:

 ALTER USER xxx IDENTIFIED BY VALUES 'xxxx';
于 2009-02-26T23:50:46.073 回答
3

http://awads.net/wp/tag/undocumented/上的更多无证资料

警告:使用风险自负。

于 2008-12-19T18:44:55.293 回答
3

WITH 子句

于 2010-01-02T10:11:02.273 回答
3

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

alter session set "_serial_direct_read"=true;

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

于 2008-12-19T17:27:57.960 回答
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-Rows 是估计的行数。
  • A-Rows 是实际的行。
  • A-Time 是实际时间。
  • 缓冲区是实际的缓冲区。

如果估计的计划与实际执行相差几个数量级,你就知道你遇到了问题。

于 2009-07-27T23:03:13.613 回答
3

不是隐藏功能,但细粒度访问控制 (FGAC),也称为行级安全性,是我过去使用过的东西,它的实现效率给我留下了深刻的印象。如果您正在寻找能够保证您可以控制向具有不同权限的用户公开行的粒度的东西 - 无论用于查看数据的应用程序(SQL*Plus 以及您的 Web 应用程序) - 那么这是一个宝石.

内置全文索引的文档更广泛,但由于其稳定性仍然很突出(只需尝试对 MS-SQL 和 Oracle 上的类似数据样本运行全文索引列的完整重新索引,您就会看到速度差异)。

于 2009-11-02T20:03:59.300 回答
2

快照表。也可以在 Oracle Lite 中找到,并且对于滚动您自己的复制机制非常有用。

于 2008-12-19T15:35:33.520 回答
2

@彼得

您实际上可以在 TOAD 中绑定类型为“Cursor”的变量,然后在您的语句中使用它,它将在结果网格中显示结果。

exec open :cur for select * from dual;
于 2009-02-16T03:23:30.677 回答
1

Scalar subquery caching is one of the most surprising features in Oracle

-- 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

The "caching" subquery above evaluates my_function(t.x) only once per unique value of t.x. If you have large partitions of the same t.x value, this will immensely speed up your queries, even if my_function is not declared DETERMINISTIC. Even if it was DETERMINISTIC, you can safe yourself a possibly expensive SQL -> PL/SQL context switch.

Of course, if my_function is not a deterministic function, then this can lead to wrong results, so be careful!

于 2012-04-18T12:02:45.567 回答
1

问:如何从 TOAD 调用带游标的存储?

A:例如,更改为您的光标、包名和存储的过程名称

declare cursor PCK_UTILS.typ_cursor;  

begin   
    PCK_UTILS.spc_get_encodedstring(  
        'U',  
        10000002,  
        null,  
        'none',  
        cursor);  
end;
于 2008-12-19T15:25:56.817 回答
1

模型子句(适用于 Oracle 10g 及更高版本)

于 2010-01-20T15:25:18.490 回答
1

WM_CONCAT 用于字符串聚合

于 2011-10-19T02:33:06.727 回答