Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 甲骨文分类_Sql_Oracle - Fatal编程技术网

Sql 甲骨文分类

Sql 甲骨文分类,sql,oracle,Sql,Oracle,我的表现很差。解释计划表明它正在进行排序(分组),这听起来不正确。我希望某种散列聚合能够产生更好的结果。有没有提示告诉oracle使用散列进行DISTINCT而不是排序? 我在类似的情况下使用了/*+USE\u HASH\u AGGREGATION*/但它不适用于DISTINCT 这是我最初的疑问: SELECT count(distinct userid) n, col FROM users GROUP BY col; 用户有3000万行,每个用户ID有12次。此查询需要70秒 现在我们把它

我的表现很差。解释计划表明它正在进行排序(分组),这听起来不正确。我希望某种散列聚合能够产生更好的结果。有没有提示告诉oracle使用散列进行DISTINCT而不是排序? 我在类似的情况下使用了/*+USE\u HASH\u AGGREGATION*/但它不适用于DISTINCT

这是我最初的疑问:

SELECT
count(distinct userid) n, col
FROM users
GROUP BY col;
用户有3000万行,每个用户ID有12次。此查询需要70秒

现在我们把它改写为

SELECT
count(userid) n, col
FROM
(SELECT distinct userid, col FROM users)
GROUP BY col
这需要40秒。 现在添加提示进行哈希而不是排序:

SELECT
count(userid) n, col
FROM
(SELECT /*+ USE_HASH_AGGREGATION */ distinct userid, col FROM users)
GROUP BY col
这需要10秒

如果有人能向我解释为什么会发生这种情况,或者我如何能够击败第一个简单的查询,使其与第三个查询一样工作,那将是非常棒的。
我之所以关心查询的简单性,是因为这些查询实际上是生成的

计划: 1) 慢:

2) 快速


试试下面的方法怎么样: 如果您在col和userid上有一个索引,那么它应该在索引中完全解析,并且根本不需要触摸表

Select count(userid) n, col
from (select col, userid from users group by col, userid)
group by col
;

+1:好地点,好工作,好运气。我也对这个很感兴趣。你能给我展示一下每个查询的解释/执行计划吗?另外,应该注意,
USE\u HASH\u AGGREGATION
提示没有正式记录。交叉发布自:当您运行sql时-检查CPU%使用率和内存使用率,可能您运行的机器是有限的。@MK.是的,真的。如果你愿意在另一个网站上发布相同的内容,那么它会在那些不太专业的网站上关闭。这种行为在堆栈交换中是非常不受欢迎的。如果您愿意,我们可以将其迁移过来,并将其与DBA问题合并。绝望并不能证明这样的交叉发布是合理的。如果表很宽,索引会有帮助,但我的数字是针对窄表的,所以索引没有帮助。
--------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |      1 |        |      5 |00:00:13.09 |     283K|    283K|   |   |      |
|   1 |  SORT GROUP BY       |               |      1 |      5 |      5 |00:00:13.09 |     283K|    283K|  3072 |  3072 | 2048  (0)|
|   2 |   VIEW               |               |      1 |   8647K|   2445K|00:00:13.16 |     283K|    283K|   |   |      |
|   3 |    HASH UNIQUE       |               |      1 |   8647K|   2445K|00:00:12.57 |     283K|    283K|   113M|    10M|  216M (0)|
|   4 |     TABLE ACCESS FULL| USERS         |      1 |     29M|     29M|00:00:07.68 |     283K|    283K|   |   |      |
--------------------------------------------------------------------------------------------------------------------------------------------
Select count(userid) n, col
from (select col, userid from users group by col, userid)
group by col
;