在 Oracle 11.2 之前,我使用自定义聚合函数将一列连接成一行。11.2 增加了这个LISTAGG
功能,所以我想改用它。我的问题是我需要消除结果中的重复项,但似乎无法做到这一点。
这是一个例子。
CREATE TABLE ListAggTest AS (
SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual
CONNECT BY rownum<=6
);
SELECT * FROM ListAggTest;
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE ListAggTest AS (
SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual
CONNECT BY rownum<=6
);
SELECT * FROM ListAggTest;
Run Code Online (Sandbox Code Playgroud)
我想看到的是:
NUM1 NUM2
---------- ---------------------
1 2
2 2 << Duplicate 2
3 3
4 4
5 5
6 6
Run Code Online (Sandbox Code Playgroud)
这是一个listagg
接近但不消除重复的版本。
SELECT Num1, listagg(Num2,'-') WITHIN GROUP (ORDER BY NULL) OVER …
Run Code Online (Sandbox Code Playgroud) 有两种方法可以使用 sqlplus 以管理员身份连接到 Oracle:
sqlplus sys as sysdba
sqlplus system/manager
我想这些帐户应该用于不同的目的。
这两个模式用于哪些任务?我什么时候应该使用其中的一个?
我们一直在使用安装在 Oracle Enterprise 11gR2 上的 BI 软件和存储库数据库。
其中一些批处理报告将尝试访问可能仍被锁定的数据库表。如何确定 Oracle 表是否已锁定?是否有任何 SQL 语句显示像历史详细信息以供分析?
我很想知道其他人使用哪些方法来跟踪对数据库所做的更改,包括表定义更改、新对象、包更改等。您是否使用带有外部版本控制系统的平面文件?触发器?其他软件?
根据Oracle 数据库安全指南,Oracle 正在弃用 OS 身份验证,其中说
请注意,REMOTE_OS_AUTHENT 参数在 Oracle 数据库 11g 第 1 版 (11.1) 中已弃用,保留只是为了向后兼容。
此外,大多数安全信息和工具都认为 操作系统(外部)身份验证是一个安全问题。我试图理解为什么会这样。以下是我看到的操作系统身份验证的一些优点:
一些语句,如 create table、insert into 等,在末尾使用分号:
CREATE TABLE employees_demo
( employee_id NUMBER(6)
, first_name VARCHAR2(20)
, last_name VARCHAR2(25)
CONSTRAINT emp_last_name_nn_demo NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)
而其他人喜欢
set echo on
connect system/manager
Run Code Online (Sandbox Code Playgroud)
也不要分号。
这背后的原因是什么?我如何决定自己在哪里放分号,在哪里不放?
我知道这个问题可能听起来太愚蠢了,但我从来没有理解这部分。
SQL*Plus 适用于 SQL 和 PL/SQL。我如何知道某些代码是 SQL 还是 PL/SQL?如果我的代码有 for 循环,它就不再是 SQL 了吗?
PL/SQL 是 SQL 的扩展,具有循环、条件等。那么任何 SQL 代码默认都是 PL/SQL 代码?不是这样吗?
SQL 和 PL/SQL 之间有分界线吗?
区分触发此问题的黑白 SQL 和 PL/SQL 的两个示例:
早些时候我创建了一个用户:
SQL>create user suhail identified by password
SQL>User created.
SQL>Grant create session,create table to suhail;
SQL>Grant Succeeded.
Run Code Online (Sandbox Code Playgroud)
但是当我以身份登录suhail
并尝试创建一个时,table
我收到一条错误消息ORA-01950: no privileges on tablespace 'SYSTEM'
。这是什么错误?为什么会发生?
SQL> connect suhail
Enter password:
Connected.
SQL> create table suhail_table(name char(10));
create table suhail_table(name char(10))
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'SYSTEM'
Run Code Online (Sandbox Code Playgroud)
我使用的是 Oracle 数据库 11g 快捷版 11.2.0.2.0 版
我的测试数据库中有一个包含 250K 行的表。(生产中有几亿个,我们可以在那里观察到同样的问题。)该表有一个 nvarchar2(50) 字符串标识符,不为空,上面有一个唯一索引(不是 PK)。
标识符由第一部分组成,它在我的测试数据库中有 8 个不同的值(生产中大约有 1000 个),然后是一个 @ 符号,最后是一个 1 到 6 位长的数字。例如,可能有 5 万行以“ABCD_BGX1741F_2006_13_20110808.xml@”开头,后面跟着 5 万个不同的数字。
当我根据其标识符查询单行时,基数估计为1,成本很低,工作正常。当我在 IN 表达式或 OR 表达式中查询多个具有多个标识符的行时,对索引的估计是完全错误的,因此使用了全表扫描。如果我用提示强制索引,它会非常快,全表扫描实际上执行的速度要慢一个数量级(并且在生产中要慢得多)。所以这是一个优化器问题。
作为测试,我使用完全相同的 DDL 和完全相同的内容复制了表(在相同的模式+表空间中)。我在第一个表上重新创建了唯一索引以获得良好的度量,并在克隆表上创建了完全相同的索引。我做了一个DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);
. 您甚至可以看到索引名称是连续的。所以现在这两个表唯一的区别是第一个是在很长一段时间内以随机顺序加载的,块分散在磁盘上(与其他几个大表一起在一个表空间中),第二个是作为一个批处理加载的插入-选择。除此之外,我想不出有什么不同。(自上次大删除以来,原始表已缩小,此后没有进行过一次删除。)
这里是sick和clone表的查询计划(黑色笔刷下的字符串全图相同,灰色笔刷下也是如此。):
(在这个例子中,有1867行以刷黑的标识符开始。2行查询产生1867*2的基数,3行查询产生1867*3的基数,等等。不能巧合的是,Oracle 似乎并不关心标识符的结尾。)
什么可能导致这种行为?显然,在生产中重新创建表会非常昂贵。
USER_TABLES:http : //i.stack.imgur.com/nDWze.jpg USER_INDEXES:http : //i.stack.imgur.com/DG9um.jpg我只更改了架构和表空间名称。您可以看到表和索引名称与查询计划屏幕截图中的相同。
我想释放 Linux 机器上的磁盘空间。我已经深入研究了空间使用情况,发现以下目录的大小很大
/u01/app/11.2.0/grid/cv/log
/u01/app/11.2.0/grid/log/diag/tnslsnr/r1n1/listener_scan2/alert (Contains xml files)
/u01/app/11.2.0/grid/rdbms/audit(Contains .aud files)
/home/oracle/oradiag_oracle/diag/clients/user_oracle/host_XXXXXXXXXX/alert(Contains xml files)
/u01/app/oracle/diag/rdbms/crimesys/crimesys1/alert (Contains xml files)
Run Code Online (Sandbox Code Playgroud)
我可以删除这些目录中的内容吗?注意:我的意思是内容而不是目录。
oracle-11g-r2 ×10
oracle ×9
sqlplus ×2
aggregate ×1
disk-space ×1
locking ×1
optimization ×1
permissions ×1
plsql ×1
security ×1
tablespaces ×1