我需要從許多行中獲取摘要數據。摘要字段是對不同字段的每個值具有多少個條目的計數。例如,一個包含人的年齡,城市,工作等的表格,摘要數據將包括像「countManager」,「countCodeMonkey」這樣的字段,然後是「countChicago」,「countNewYork」等等。哪個更快,水平或垂直計數?
我知道,讓一切的簡單方法是:
select count(*) from table
group by age, city, job
但這是垂直計數 - 不同的行每個我需要的價值。而不是具有計數的行,我需要字段,因爲我有其他字段要分組,例如狀態。所以我想我的結果看起來像這樣:
| State | countManager | countMonkey |
| IL | 3 | 25 |
| NY | 5 | 40 |
我正在尋找兩種方法來做到這一點。我們已經實現了一個,並且需要20分鐘才能執行。我想知道如果不同的方式會更快。
目前的方式是這樣的:
create view managers as
select state, count(*) as theCount from table
where job = 'Manager'
group by state;
create view monkeys as
select state, count(*) as theCount from table
where job = 'Monkey'
group by state;
select managers.theCount as managers, monkeys.theCount as monkeys
from managers left join monkeys
on managers.state = monkeys.state;
在現實情況下,有大約20多個視圖,因此20個連接。
我正在考慮以下水平計數方法代替:
select state,
sum(case when job='Manager' then 1 else 0 end) as managers,
sum(case when job='Monkey' then 1 else 0 end) as monkeys
from table
group by state;
這消除了連接。但我不知道「總結案例」聲明的表現。這會更快,大約相同,還是慢得多?引擎是否必須多次通過這些行,對於每個這樣的計數字段來說一次?還是足夠聰明地計算一次運行中的所有字段,檢查每個值並遞增適當的總和?
我可能花了一天的時間寫一段腳本來生成大量的垃圾數據來測試這個,但我仍然想知道數據庫引擎的行爲,我在其他網上找不到。
這可能取決於涉及的數據庫引擎。你有哪一個想法? – 2010-09-17 21:47:56
如果你有Microsoft SQL Server,他們有一個查詢計劃的事情,他們向你展示數據庫引擎如何解析/執行你的查詢 – 2010-09-17 21:48:41
我相信我們正在使用Postgres。 – Tesserex 2010-09-17 21:56:34