2010-09-17 19 views
1

我需要從許多行中獲取摘要數據。摘要字段是對不同字段的每個值具有多少個條目的計數。例如,一個包含人的年齡,城市,工作等的表格,摘要數據將包括像「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; 

這消除了連接。但我不知道「總結案例」聲明的表現。這會更快,大約相同,還是慢得多?引擎是否必須多次通過這些行,對於每個這樣的計數字段來說一次?還是足夠聰明地計算一次運行中的所有字段,檢查每個值並遞增適當的總和?

我可能花了一天的時間寫一段腳本來生成大量的垃圾數據來測試這個,但我仍然想知道數據庫引擎的行爲,我在其他網上找不到。

+0

這可能取決於涉及的數據庫引擎。你有哪一個想法? – 2010-09-17 21:47:56

+0

如果你有Microsoft SQL Server,他們有一個查詢計劃的事情,他們向你展示數據庫引擎如何解析/執行你的查詢 – 2010-09-17 21:48:41

+0

我相信我們正在使用Postgres。 – Tesserex 2010-09-17 21:56:34

回答

3

完全取決於引擎以及您希望如何查看數據,但您的第二個選項絕對應該更快。

即使你的第一個查詢20分鐘也是荒謬的,但除非你有幾十億行。在這種情況下,您應該查看每月/每週歸檔數據,並在表格中預編譯彙總數據,您可以根據這些數據進行切片和切塊。

+0

由於索引問題 - 或者說,缺乏索引,視圖可能會變慢。 – 2010-09-17 22:56:33

1

如果您的交易與其他交易沒有並行性,那麼「sum case」是一個不錯的選擇。彙總函數爲AVG,SUM,GROUP BY,會降低性能。保持聯繫兩件事:「分而治之」和「數字數據比文本數據更快」。

創建一個數據倉庫(一個表,一個數據庫),以避免併發性和提升處理。

CPU是了不起的計算器:將您的分類數據("NY""LA""Man""Woman")的數字數據(126162),並提高你的挖掘。

清理你關於數據庫供應商或平臺選擇的想法,但關係代數。