0

我对甲骨文很陌生。我在这里有一张桌子和一些查询:

http://sqlfiddle.com/#!4/a7b7c/1

我想知道如何查询:

select distinct name,id from test;

select name,id from test group by name,id;

产生相同的输出。我如何在 oracle 中找到上述查询的执行顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行。

4

4 回答 4

1

通常,如果您想调试性能,您会使用如下解释计划:

说明从测试中选择不同名称、ID 的计划;

EXPLAIN PLAN FOR SELECT NAME, ID FROM TEST GROUP BY (NAME,ID);

这将向您展示查询优化器认为最好的处理类型,您不能保证您将始终获得相同的计划,例如,如果您添加索引,计划可能会更改,您可以使用提示,但我不认为我已经看到它们实际上被使用了

于 2013-04-28T12:16:02.840 回答
1

看看你的 SQL Fiddle:你的表中有 5 条记录,有 5 种 NAME 和 ID 组合。因此,您发布的查询只会返回所有行。实际上,它们与此查询相同...

select name, id from test;

......只有额外的资源消耗用于数据库为确保唯一性而承担的无效排序。添加与 NAME 和 ID 重复但具有不同 EMAIL 的新记录将帮助您了解正在发生的事情。

您应该明白,在现实生活中使用 DISTINCT 实际上是非常罕见的:正确定义的 WHERE 子句应该足以生成唯一的结果集。GROUP BY 通常与 COUNT() 或 SUM() 等聚合函数一起使用;例如,有多少个 NAME + ID 有多个 EMAIL?

select name, id from test 
group by name, id having count(*) > 1;

至于排序,您执行的查询需要排序,因此结果集的顺序可能与输入顺序不同。无论如何,Oracle 不保证其结果集的顺序,但排序使其更难以预测。为了获得这种保证,有必要指定一个 ORDER BY 子句:

select distinct name, id from test 
order by name, id 

该 ORDER BY 子句将保证任何语句的顺序相同,无论在过滤和处理结果集时发生什么其他处理。

于 2013-04-28T13:59:21.620 回答
1

我如何在 oracle 中找到上述查询的执行顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行。

在 SQL 中,确定行的顺序是未指定的,除非您使用order by子句明确要求。(如果没有,您将按照与您的查询匹配的顺序获取行,它们的顺序取决于查询计划。)

[查询]产生相同的输出。

这是因为你在那里有 id。据推测,它们都是不同的,并在您的实际模式中标记为主键。

distinct,顺便说一句,是group by所有意图和目的的所有检索字段。

无论如何,如果您希望行的顺序一致,您需要类似order by name, id.

于 2013-04-28T13:39:30.330 回答
1

所有查询产生相同结果的原因是表具有唯一值。

在这种情况下使用“分组依据”是没有意义的。当您想要计数或求和(或其他数学运算)时,请使用“分组依据”。这是一个这样的例子:

select name, count(*) ct from test group by name

这将显示名称以及该名称在表格中出现的次数。

关于输出的顺序:Oracle 将按随机顺序返回行,直到得到指示。所以要指定一个特定的顺序,然后使用“order by”子句:

select name,id from test order by name, id; 

然后,您可以保证返回的结果按名称排序。如果名称出现不止一次,它们将按 id 排序。

于 2013-04-28T13:16:52.537 回答