我有一个包含 ~12M 行数据的表。这是表结构:
SYSTEM_ID
BATCH_ID
MEASUREMENT_INDEX,
PARAMETER_ONE,
PARAMETER_TWO
Run Code Online (Sandbox Code Playgroud)
主键由前三列组成。我也有一个关于SYSTEM_ID ASC
,的索引BATCH_ID ASC
。
如果我执行以下查询:
SELECT PARAMETER_ONE
FROM RESULTS_TABLE
WHERE SYSTEM_ID=1
AND BATCH_ID=100;
Run Code Online (Sandbox Code Playgroud)
结果在大约 0.002 秒后返回。
但是,当我尝试执行任何聚合函数时,例如SUM
, MAX
, AVG
, STDDEV
,查询时间会增加到 400 秒左右!我已经尝试了这个查询的各种排列,例如:
SELECT AVG(PARAMETER_ONE)
FROM ( SELECT PARAMETER_ONE
FROM RESULTS_TABLE
WHERE SYSTEM_ID=1
AND BATCH_ID=100
);
Run Code Online (Sandbox Code Playgroud)
和:
SELECT DISTINCT
AVG(PARAMETER_ONE) over (partition by system_id, batch_id)
FROM RESULTS_TABLE
WHERE SYSTEM_ID = 123
AND BATCH_ID = 10;
Run Code Online (Sandbox Code Playgroud)
这些似乎都没有区别。有没有其他人有这个问题??
============================
聚合函数查询的解释计划是:
Plan hash value: 2759933517
-------------------------------------------------------------------------------------------------------------
| …
Run Code Online (Sandbox Code Playgroud) 我有一个需要通过 Oracle 触发器发送电子邮件的应用程序。我知道在 Oracle 11g 中,您必须有一个 ACL 文件才能授予某些模式访问网络的权限。我的计划是为每个需要访问网络的用户创建一个单独的 ACL 文件,然后使用以下查询检查它是否已正确创建:
SELECT * FROM DBA_NETWORK_ACLS;
Run Code Online (Sandbox Code Playgroud)
但是,似乎此查询只返回了一条记录 - 始终是创建的最新 ACL。这是否意味着您只能拥有一个 ACL?如果是这样,大概这意味着在客户端的服务器上安装这个应用程序时,我必须只向他们现有的 ACL 添加权限,而不是尝试创建一个新的?
谢谢!
这些是我正在使用的命令:
--create ACL for USER1
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(ACL => 'testacl1.xml',
DESCRIPTION => 'ACL',
PRINCIPAL => 'USER1',
IS_GRANT => TRUE,
PRIVILEGE => 'connect');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL => 'testacl1.xml',
PRINCIPAL => 'USER1',
IS_GRANT => TRUE,
PRIVILEGE => 'resolve');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(ACL => 'testacl1.xml', host => '*');
--create ACL for USER2
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(ACL => 'testacl2.xml',
DESCRIPTION => 'ACL',
PRINCIPAL => 'USER2',
IS_GRANT => TRUE,
PRIVILEGE => 'connect'); …
Run Code Online (Sandbox Code Playgroud)