寫(xiě)著簡(jiǎn)單跑得又快的數(shù)據(jù)庫(kù)語(yǔ)言 SPL
select max (consecutive_day)from (select count(*) (consecutive_dayfrom (select sum(rise_mark) over(order by trade_date) days_no_gainfrom (select trade_date,case when closing_price>lag(closing_price) over(order by trade_date)then 0 else 1 END rise_markfrom stock_price ) )group by days\_no\_gain)
這個(gè)語(yǔ)句的工作原理就不解釋了,反正有點(diǎn)繞,同學(xué)們可以自己嘗試一下。
SELECT TOP 10 x FROM T ORDER BY x DESC但是,這個(gè)語(yǔ)句對(duì)應(yīng)的執(zhí)行邏輯是先對(duì)所有數(shù)據(jù)進(jìn)行大排序,然后再取出前 10 個(gè),后面的不要了。大家知道,排序是一個(gè)很慢的動(dòng)作,會(huì)多次遍歷數(shù)據(jù),如果數(shù)據(jù)量大到內(nèi)存裝不下,那還需要外存做緩存,性能還會(huì)進(jìn)一步急劇下降。如果嚴(yán)格按這句 SQL 體現(xiàn)的邏輯去執(zhí)行,這個(gè)運(yùn)算無(wú)論如何是跑不快的。然而,很多程序員都知道這個(gè)運(yùn)算并不需要大排序,也用不著外存緩存,一次遍歷用一點(diǎn)點(diǎn)內(nèi)存就可以完成,也就是存在更高性能的算法。可惜的是,用 SQL 卻寫(xiě)不出這樣的算法,只能寄希望于數(shù)據(jù)庫(kù)的優(yōu)化器足夠聰明,能把這句 SQL 轉(zhuǎn)換成高性能算法執(zhí)行,但情況復(fù)雜時(shí)數(shù)據(jù)庫(kù)的優(yōu)化器也未必靠譜。
stock_price.sort(trade_date).group@o(closing_price<closing_price[-1]).max(~.len())計(jì)算思路和前面的 SQL 相同,但因?yàn)橐肓擞行蛐院螅磉_(dá)起來(lái)容易多了,不再繞了。
T.groups(;top(-10,x))SPL 有更豐富的集合數(shù)據(jù)類(lèi)型,容易描述單次遍歷上實(shí)施簡(jiǎn)單聚合的高效算法,不涉及大排序動(dòng)作。
評(píng)論
圖片
表情

