2014-01-11 34 views
0

我有这样的查询:有什么办法,以加快使用CASE语句查询?

SELECT id 
FROM table 
GROUP BY columnName, CASE WHEN columnName IS NULL THEN id ELSE 0 END 

GROUP声明CASE声明的目的是为了防止与排在null从COLUMNNAME(我使用到组行一起列值)进行分组一起。我只想组在一起有columnName非空值的行。

问题是CASE语句将查询的执行时间从0.09s增加到0.854s,增加了约10倍。

使用EXPLAIN,我可以看到,如果没有CASE语句,用于columnName的指数,但与CASE声明没有使用索引,这我假设就是为什么查询变得如此慢得多?

有什么办法来防止CASE声明从这么多拖慢查询?例如,是否可以索引CASE声明?

我对SQL非常不熟悉,所以我能想到的唯一解决方案是创建另一个列,名称类似columnName_or_id,并在我的软件中包含逻辑,在插入行后将另一个查询放入idcolumnName_or_id,如果稍后将值插入columnName也将该值插入到columnName_or_id(因此,新列的名称,因为它包含行idcolumnName值)。这将消除在查询CASE声明的必要性。

有没有更好的方法?

回答

1

也许这将是快在这种情况下做了union all

(SELECT id 
FROM table 
WHERE columnName is not null 
GROUP BY columnName 
) 
union all 
(select id 
from table 
where columnName is null 
) 

如果where columnName is not null防止使用索引,然后尝试having columnName is not null

+0

不要UNION打破索引? –

+0

@RobertHarvey。 。 。不是我的知识。子查询应该使用适当的索引。 –

+0

这是一个明显的改进。它将执行时间减少到“0.244s” - 仍然比原始查询慢3倍,但比“CASE”方法快3.5倍。 – Nate

2

尝试COALESCE()

GROUP BY coalesce(columnName, id) 
+0

我只是试了一下,执行时间是'0.808s',所以没有改善,不幸的是。 – Nate