【发布时间】:2011-12-18 03:23:09
【问题描述】:
我正在使用包含 500 000 个条目的表在 HSQLDB 服务器上执行一些测试。该表没有索引。有 5000 个不同的业务密钥。我需要一份他们的清单。
我自然是从DISTINCT 查询开始的:
SELECT DISTINCT business_key
FROM memory
WHERE concept <> 'case' OR
attrib <> 'status' OR
value <> 'closed';
大约需要 90 秒!!!
然后我尝试使用GROUP BY:
SELECT business_key
FROM memory
WHERE concept <> 'case' OR
attrib <> 'status' OR
value <> 'closed';
GROUP BY business_key
而且需要 1 秒!!!
试图找出我运行 EXLAIN PLAN FOR 的区别,但它似乎为两个查询提供了相同的信息。
EXLAIN PLAN FOR DISTINCT ...
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
EXLAIN PLAN FOR SELECT ... GROUP BY ...
isDistinctSelect=[false]
isGrouped=[true]
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
groupColumns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
编辑
我做了额外的测试。 HSQLDB 中有 500 000 条记录以及所有不同的业务密钥,DISTINCT 的性能现在更好 - 3 秒,而 GROUP BY 大约需要 9 秒。
在MySQL 中,两个查询都执行相同的操作:
MySQL:500 000 行 - 5 000 个不同的业务键:
两个查询:0.5 秒
MySQL:500 000 行 - 所有不同的业务键:
SELECT DISTINCT ... - 11 秒
SELECT ... GROUP BY business_key - 13 秒
所以问题只与HSQLDB有关。
如果有人能解释为什么会有如此巨大的差异,我将不胜感激。
【问题讨论】:
-
请显示
EXPLAIN PLAN的结果,并在运行GROUP BY后尝试运行DISTINCT查询,看看是否某些缓存会影响时间... -
假设您为每个查询获得相同的计划,听起来好像表数据或结果已被缓存。
-
我运行了很多次,相信缓存不是问题。我正在发布
EXLAIN PLAN FOR输出。 -
我有一个想法,但我真的不确定 - 请尝试
SELECT DISTINCT business_key FROM (SELECT business_key FROM memory WHERE concept <> 'case' or attrib <> 'status' or value <> 'closed')- 如果我的想法是正确的,这应该会显示与GROUP BY相同的性能。 -
@Yahia:仍然很慢 - 94 秒。我将在 MySQL 中运行相同的查询,看看会显示什么
标签: sql performance group-by distinct hsqldb