【发布时间】:2011-04-09 05:22:24
【问题描述】:
嘿,我有以下表格和 SQL:
T1:ID、col2、col3 - PK(ID) - 2300 万行
T2:ID、col2、col3 - PK(ID) - 2300 万行
T3:ID、名称、值 - PK(ID,name) -66 万行
1) 下面的 sql 非常快地返回 10k 行结果集,没有问题。
select top 10000 T1.col2, T2.col2, T3.name, T4.value
from T1, T2, T3
where T1.ID = T2.ID and T1.ID *= T3.ID and T3.name in ('ABC','XYZ')
and T2.col1 = 'SOMEVALUE'
2) 下面的 sql 永远占用了。
select top 10000 T1.col2, T2.col2,
ABC = min(case when T3.name='ABC ' then T3.value end)
XYZ = min(case when T3.name='XYZ ' then T3.value end)
from T1, T2, T3
where T1.ID = T2.ID and T1.ID *= T3.ID and T3.name in ('ABC','XYZ')
and T2.col1 = 'SOMEVALUE'
group by T1.col2, T2.col2,
这两个查询之间的显示计划的唯一区别是查询 2)。我不理解它 100%,它是在临时表中选择没有前 10000 个的整个结果集然后对其进行分组吗?这就是它慢的原因吗?
STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped MINIMUM AGGREGATE.
FROM TABLE ...etc..
TO TABLE
Worktable1.
STEP 2
The type of query is SELECT.
FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
我的问题是
1) 为什么查询 2) 这么慢
2) 如何在保持查询逻辑相同的情况下进行修复,最好将其限制为像以前一样仅选择 1 个 SQL。
谢谢你
【问题讨论】:
标签: performance group-by sybase case-when