SQL研究 非平衡樹聚合

2021-04-30 08:10:15 字數 2258 閱讀 8032

今天,我重新

檢查了乙個困擾已久的問題,在經過仔細的考慮,算是找到了乙個比較合理的解決辦法。

問題是這樣的,表

storeproductsales

記錄一系列的商場以及它們每天的營業額。商場與商場之間有從屬關係,記錄在

store_withacestor

表裡。當使用者查詢某個商場的對某個產品的銷售額時,除了

返回自己的營業額,還

需要包含所有子商場的營業額。

示例結構和資料如下:

storeproductsales

(dayidint,

storeidnvarchar(8),

productid nvarchar(8),

sales int

)insert into

storeproductsales values(1,'bj','cloth',100)

insert into

storeproductsales values(1,'bj','shoe',100)

insert into

storeproductsales values(1,'bj-haidian','cloth',50) 表

store_withancestor

存放有

parent, child

bj, bj

bj, bj-haidian

bj_haidian, bj_haidian

使用者輸入某個

store的id

,開始dayid

和結束dayid

,輸出該

store

在這段時間裡所有賣出的

product

及其銷售量。

最簡單的方法是從

store_withancestor

中選出需要

store

所有子store

,如果使用者選擇

bj,那麼就把bj,

bj-haidian

都選出來,然後把所有這些商場上成交的產品銷量疊加起來;

這樣做是很慢的。不妨簡單的計算一下,如果某個商場有

100個子商場,共計

10000

個商品,那麼為了求出該商場的每個產品的日銷量,需要做

1百萬次加法運算。同時應該考慮到資料庫的記憶體掃瞄工作。假設資料按照

store

做聚集索引,那麼對於每個商場,需要額外讀取

1百萬的頁面。

怎樣才能使它快一點呢?

很容易想到的是如果我們能生成乙個聚合表,在該表中存放的

sales

就是商場本身的銷售量加上所有孩子的銷售量。這樣查詢的時候,既不需要做

online

的計算,也不需要執行額外的

io操作。

但是這樣做有乙個問題。

那就是您不能保證每個商品在每個商場每天都有銷量。

假設這樣的情形。在某天,

cloth

在bj_haidian

銷售了100

,而在bj

沒有銷售。那麼在上述的聚合表裡是不會出現

bj的記錄的,因為它只存放自己和孩子的銷售量之和。當使用者查詢那天

bj的銷售額時,由於不查詢它的孩子,

cloth

的銷量是0。

顯然這是乙個錯誤。

當然如果原始表中有一條記錄,bj,

cloth,0

,那一切都很好。但是你不可能那麼做。假如有

1000

個store

,10000

個商品,在表中每天加入

1千萬行只是為了佔位置,看起來是不可理喻的。

那麼還有沒有別的辦法呢?

我的方法是在源表的基礎上加乙個列

withparent

,它表明在那一天的銷售記錄中,對於本產品是否有父輩的商場也**了。例如,在

20090601

這一天,

bj_haidian和bj

都賣出了

cloth

,那麼這一行的

withparent

對應為0

,如果bj

沒有賣出,則為1.

當使用者查詢

bj的銷售記錄時,我任然對它進行擴充套件,但我並不需要載入所有子節點對應的行,因為

withparent

就在索引裡,我們只需要掃瞄索引節點就可以判斷是否需要載入這一行。因此我們不但可以減少載入所需的

io操作,還減少了額外的加法操作。

實際證明,該方法使得執行時間縮短了十分之一。

非平衡電橋電阻計算 用非平衡電橋測量電阻

rrr rx2.非平衡電橋 非平衡電橋也稱不平衡電橋或微差電橋。圖 為非平衡電橋的原理圖,bd 之間為一 負載電阻rg 用非平衡電橋測量電阻時,是使rr 和r保持不變,rx 即r 變化時則 u變化。再根據u與 rx的函式關係,通過檢測 u的變化從而測得rx 由於可以檢測連續 變化的u 所以可以檢測連...

平衡式傳輸與非平衡式傳輸

目錄 1.概述 2.平衡式傳輸 3.非平衡傳輸 訊號有兩種傳輸方式,即對地平衡式與非平衡 單端接地 式。平衡式的訊號傳輸線路不易受外界的如交流聲,其他串音,電器裝置雜訊等干擾。非平衡式則易受干擾,所以在專業領域一般都採用平衡式傳輸。在工程中考慮到成本問題,也會相對選用一些民用級裝置,他們大多都採用非...

SQL注入研究

請勿用於非法用途,本 只是為了讓廣大asp愛好者明白原理,防範於未然。dim regex,retval 建立變數。set regex new regexp 建立正規表示式。regex.pattern patrn 設定模式。regex.ignorecase false 設定是否區分大小寫。regexp...