小编use*_*653的帖子

Oracle 聚合函数大幅减慢查询速度

我有一个包含 ~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)

performance oracle aggregate

5
推荐指数
1
解决办法
9406
查看次数

您可以拥有多个 Oracle ACL 文件吗?

我有一个需要通过 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)

oracle oracle-11g-r2 database-mail

2
推荐指数
1
解决办法
7263
查看次数