0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)庫(kù)語(yǔ)言的目標(biāo),SQL為什么不行

程序員cxuan ? 來(lái)源:程序員cxuan ? 作者:程序員cxuan ? 2022-04-14 09:27 ? 次閱讀

數(shù)據(jù)庫(kù)語(yǔ)言的目標(biāo)

要說(shuō)清這個(gè)目標(biāo),先要理解數(shù)據(jù)庫(kù)是做什么的。

數(shù)據(jù)庫(kù)這個(gè)軟件,名字中有個(gè)“庫(kù)”字,會(huì)讓人覺(jué)得它主要是為了存儲(chǔ)的。其實(shí)不然,數(shù)據(jù)庫(kù)實(shí)現(xiàn)的重要功能有兩條:計(jì)算、事務(wù)!也就是我們常說(shuō)的 OLAP 和 OLTP,數(shù)據(jù)庫(kù)的存儲(chǔ)都是為這兩件事服務(wù)的,單純的存儲(chǔ)并不是數(shù)據(jù)庫(kù)的目標(biāo)。

我們知道,SQL 是目前數(shù)據(jù)庫(kù)的主流語(yǔ)言。那么,用 SQL 做這兩件事是不是很方便呢?

事務(wù)類(lèi)功能主要解決數(shù)據(jù)在寫(xiě)入和讀出時(shí)要保持的一致性,實(shí)現(xiàn)這件事的難度并不小,但對(duì)于應(yīng)用程序的接口卻非常簡(jiǎn)單,用于操縱數(shù)據(jù)庫(kù)讀寫(xiě)的代碼也很簡(jiǎn)單。如果假定目前關(guān)系數(shù)據(jù)庫(kù)的邏輯存儲(chǔ)模式是合理的(也就是用數(shù)據(jù)表和記錄來(lái)存儲(chǔ)數(shù)據(jù),其合理性與否是另一個(gè)復(fù)雜問(wèn)題,不在這里展開(kāi)了),那么 SQL 在描述事務(wù)類(lèi)功能時(shí)沒(méi)什么大問(wèn)題,因?yàn)椴⒉恍枰枋龆鄰?fù)雜的動(dòng)作,復(fù)雜性都在數(shù)據(jù)庫(kù)內(nèi)部解決了。

但計(jì)算類(lèi)功能卻不一樣了。

這里說(shuō)的計(jì)算是個(gè)更廣泛的概念,并不只是簡(jiǎn)單的加加減減,查找、關(guān)聯(lián)都可以看成是某種計(jì)算。

什么樣的計(jì)算體系才算好呢?

還是兩條:寫(xiě)著簡(jiǎn)單、跑得快。

寫(xiě)著簡(jiǎn)單,很好理解,就是讓程序員很快能寫(xiě)出來(lái)代碼來(lái),這樣單位時(shí)間內(nèi)可以完成更多的工作;跑得快就更容易理解,我們當(dāng)然希望更短時(shí)間內(nèi)獲得計(jì)算結(jié)果。

其實(shí) SQL 中的 Q 就是查詢的意思,發(fā)明它的初衷主要是為了做查詢(也就是計(jì)算),這才是 SQL 的主要目標(biāo)。然而,SQL 在描述計(jì)算任務(wù)時(shí),卻很難說(shuō)是很勝任的。

SQL為什么不行

先看寫(xiě)著簡(jiǎn)單的問(wèn)題。

SQL 寫(xiě)出來(lái)很象英語(yǔ),有些查詢可以當(dāng)英語(yǔ)來(lái)讀和寫(xiě)(網(wǎng)上多得很,就不舉例了),這應(yīng)當(dāng)算是滿足寫(xiě)著簡(jiǎn)單這一條了吧。

且慢!我們?cè)诮炭茣?shū)上看到的 SQL 經(jīng)常只有兩三行,這些 SQL 確實(shí)算是寫(xiě)著簡(jiǎn)單的,但如果我們嘗試一些稍復(fù)雜化的問(wèn)題呢?

這是一個(gè)其實(shí)還不算很復(fù)雜的例子:計(jì)算一支股票最長(zhǎng)連續(xù)上漲了多少天?用 SQL 寫(xiě)出來(lái)是這樣的:

select max (consecutive_day)from (select count(*)

(consecutive_day from (select sum(rise_mark) over(order by trade_date) days_no_gain

from (select trade_date,

case when closing_price》lag(closing_price) over(order by trade_date)

then 0 else 1 END rise_mark

from stock_price

group by days_no_gain)

這個(gè)語(yǔ)句的工作原理就不解釋了,反正有點(diǎn)繞,同學(xué)們可以自己嘗試一下。

這是潤(rùn)乾公司招聘考題,通過(guò)率不足 20%;因?yàn)樘y,后來(lái)被改成另一種方式:把 SQL 語(yǔ)句寫(xiě)出來(lái)讓?xiě)?yīng)聘者解釋它在算什么,通過(guò)率依然不高。

這說(shuō)明什么?說(shuō)明情況稍有復(fù)雜,SQL 就變得即難懂又難寫(xiě)!

再看跑得快的問(wèn)題,還是一個(gè)經(jīng)常拿出來(lái)的簡(jiǎn)單例子:1 億條數(shù)據(jù)中取前 10 名。這個(gè)任務(wù)用 SQL 寫(xiě)出來(lái)并不復(fù)雜:

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)化器也未必靠譜。

看樣子,SQL 在這兩方面做得都不夠好。這兩個(gè)并不復(fù)雜的問(wèn)題都是這樣,現(xiàn)實(shí)中數(shù)千行的 SQL 代碼中,這種難寫(xiě)且跑不快的情況比比皆是。

為什么 SQL 不行呢?

要回答這個(gè)問(wèn)題,我們要分析一下用程序代碼實(shí)現(xiàn)計(jì)算到底是在干什么。

本質(zhì)上講,編寫(xiě)程序的過(guò)程,就是把解決問(wèn)題的思路翻譯成計(jì)算機(jī)可執(zhí)行的精確化形式語(yǔ)言的過(guò)程。舉例來(lái)說(shuō),就象小學(xué)生解應(yīng)用題,分析問(wèn)題想出解法之后,還要列出四則運(yùn)算表達(dá)式。用程序計(jì)算也是一樣,不僅要想出解決問(wèn)題的方法,還要把解法翻譯成計(jì)算機(jī)能理解執(zhí)行的動(dòng)作才算完成。

用于描述計(jì)算方法的形式語(yǔ)言,其核心在于所采用的代數(shù)體系。所謂代數(shù)體系,簡(jiǎn)單說(shuō)就是一些數(shù)據(jù)類(lèi)型和其上的運(yùn)算規(guī)則,比如小學(xué)學(xué)到的算術(shù),就是整數(shù)和加減乘除運(yùn)算。有了這套東西,我們就能把想做的運(yùn)算用這個(gè)代數(shù)體系約定的符號(hào)寫(xiě)出來(lái),也就是代碼,然后計(jì)算機(jī)就可以執(zhí)行了。

如果這個(gè)代數(shù)體系設(shè)計(jì)時(shí)考慮不周到,提供的數(shù)據(jù)類(lèi)型和運(yùn)算不方便,那就會(huì)導(dǎo)致描述算法非常困難。這時(shí)候會(huì)發(fā)生一個(gè)怪現(xiàn)象:翻譯解法到代碼的難度遠(yuǎn)遠(yuǎn)超過(guò)解決問(wèn)題本身。

舉個(gè)例子,我們從小學(xué)習(xí)用阿拉伯?dāng)?shù)字做日常計(jì)算,做加減乘除都很方便,所有人都天經(jīng)地義認(rèn)為數(shù)值運(yùn)算就該是這樣的。其實(shí)未必!估計(jì)很多人都知道還有一種叫做羅馬數(shù)字的東西,你知道用羅馬數(shù)字該怎么做加減乘除嗎?古羅馬人又是如何上街買(mǎi)菜的?

代碼難寫(xiě)很大程度是代數(shù)的問(wèn)題。

再看跑不快的原因。

軟件沒(méi)辦法改變硬件的性能,CPU 和硬盤(pán)該多快就是多快。不過(guò),我們可以設(shè)計(jì)出低復(fù)雜度的算法,也就是計(jì)算量更小的算法,這樣計(jì)算機(jī)執(zhí)行的動(dòng)作變少,自然也就會(huì)快了。但是,光想出算法還不夠,還要把這個(gè)算法用某種形式語(yǔ)言寫(xiě)得出來(lái)才行,否則計(jì)算機(jī)不會(huì)執(zhí)行。而且,寫(xiě)起來(lái)還要比較簡(jiǎn)單,都要寫(xiě)很長(zhǎng)很麻煩,也沒(méi)有人會(huì)去用。所以呢,對(duì)于程序來(lái)講,跑得快和寫(xiě)著簡(jiǎn)單其實(shí)是同一個(gè)問(wèn)題,背后還是這個(gè)形式語(yǔ)言采用的代數(shù)的問(wèn)題。如果這個(gè)代數(shù)不好,就會(huì)導(dǎo)致高性能算法很難實(shí)現(xiàn)甚至實(shí)現(xiàn)不了,也就沒(méi)辦法跑得快了。就象上面說(shuō)的,用 SQL 寫(xiě)不出我們期望的小內(nèi)存單次遍歷算法,能不能跑得快就只能寄希望于優(yōu)化器。

我們?cè)僮鰝€(gè)類(lèi)比:

上過(guò)小學(xué)的同學(xué)大概都知道高斯計(jì)算 1+2+3+…+100 的小故事。普通人就是一步步地硬加 100 次,高斯小朋友很聰明,發(fā)現(xiàn) 1+100=101、2+99=101、…、50+51=101,結(jié)果是 50 乘 101,很快算完回家午飯了。

聽(tīng)過(guò)這個(gè)故事,我們都會(huì)感慨高斯很聰明,能想到這么巧妙的辦法,即簡(jiǎn)單又迅速。這沒(méi)有錯(cuò),但是,大家容易忽略一點(diǎn):在高斯的時(shí)代,人類(lèi)的算術(shù)體系(也是一個(gè)代數(shù))中已經(jīng)有了乘法!象前面所說(shuō),我們從小學(xué)習(xí)四則運(yùn)算,會(huì)覺(jué)得乘法是理所當(dāng)然的,然而并不是!乘法是后于加法被發(fā)明出來(lái)的。如果高斯的年代還沒(méi)有乘法,即使有聰明的高斯,也沒(méi)辦法快速解決這個(gè)問(wèn)題。

目前主流數(shù)據(jù)庫(kù)是關(guān)系數(shù)據(jù)庫(kù),之所以這么叫,是因?yàn)樗臄?shù)學(xué)基礎(chǔ)被稱(chēng)為關(guān)系代數(shù),SQL 也就是關(guān)系代數(shù)理論上發(fā)展出來(lái)的形式語(yǔ)言。

現(xiàn)在我們能回答,為什么 SQL 在期望的兩個(gè)方面做得不夠好?問(wèn)題出在關(guān)系代數(shù)上,關(guān)系代數(shù)就像一個(gè)只有加法還沒(méi)發(fā)明乘法的算術(shù)體系,很多事做不好是必然的。

關(guān)系代數(shù)已經(jīng)發(fā)明五十年了,五十年前的應(yīng)用需求以及硬件環(huán)境,和今天比的差異是很巨大了,繼續(xù)延用五十年前的理論來(lái)解決今天的問(wèn)題,聽(tīng)著就感覺(jué)太陳舊了?然而現(xiàn)實(shí)就是這樣,由于存量用戶太多,而且也還沒(méi)有成熟的新技術(shù)出現(xiàn),基于關(guān)系代數(shù)的 SQL,今天仍然是最重要的數(shù)據(jù)庫(kù)語(yǔ)言。雖然這幾十年來(lái)也有一些改進(jìn)完善,但根子并沒(méi)有變,面對(duì)當(dāng)代的復(fù)雜需求和硬件環(huán)境,SQL 不勝任也是情理之中的事。

而且,不幸的是,這個(gè)問(wèn)題是理論上的,在工程上無(wú)論如何優(yōu)化也無(wú)濟(jì)于事,只能有限改善,不能根除。不過(guò),絕大部分的數(shù)據(jù)庫(kù)開(kāi)發(fā)者并不會(huì)想到這一層,或者說(shuō)為了照顧存量用戶的兼容性,也沒(méi)打算想到這一層。于是,主流數(shù)據(jù)庫(kù)界一直在這個(gè)圈圈里打轉(zhuǎn)轉(zhuǎn)。

SPL為什么能行

那么該怎樣讓計(jì)算寫(xiě)著更簡(jiǎn)單、跑得更快呢?

發(fā)明新的代數(shù)!有“乘法”的代數(shù)。在其基礎(chǔ)上再設(shè)計(jì)新的語(yǔ)言。

這就是 SPL 的由來(lái)。它的理論基礎(chǔ)不再是關(guān)系代數(shù),稱(chēng)為離散數(shù)據(jù)集?;谶@個(gè)新代數(shù)設(shè)計(jì)的形式語(yǔ)言,起名為SPL(Structured Process Language)。

SPL 針對(duì) SQL 的不足(更確切地說(shuō)法是,離散數(shù)據(jù)集針對(duì)關(guān)系代數(shù)的各種缺陷)進(jìn)行了革新。SPL 重新定義了并擴(kuò)展許多結(jié)構(gòu)化數(shù)據(jù)中的運(yùn)算,增加了離散性、強(qiáng)化了有序計(jì)算、實(shí)現(xiàn)了徹底的集合化、支持對(duì)象引用、提倡分步運(yùn)算。

限于篇幅,這里不能介紹 SPL(離散數(shù)據(jù)集)的全貌。我們?cè)谶@里列舉 SPL(離散數(shù)據(jù)集)針對(duì) SQL(關(guān)系代數(shù))的部分差異化改進(jìn):

游離記錄

離散數(shù)據(jù)集中的記錄是一種基本數(shù)據(jù)類(lèi)型,它可以不依賴于數(shù)據(jù)表而獨(dú)立存在。數(shù)據(jù)表是記錄構(gòu)成的集合,而構(gòu)成某個(gè)數(shù)據(jù)表的記錄還可以用于構(gòu)成其它數(shù)據(jù)表。比如過(guò)濾運(yùn)算就是用原數(shù)據(jù)表中滿足條件的記錄構(gòu)成新數(shù)據(jù)表,這樣,無(wú)論空間占用還是運(yùn)算性能都更有優(yōu)勢(shì)。

關(guān)系代數(shù)沒(méi)有可運(yùn)算的數(shù)據(jù)類(lèi)型來(lái)表示記錄,單記錄實(shí)際上是只有一行的數(shù)據(jù)表,不同數(shù)據(jù)表中的記錄也不能共享。比如,過(guò)濾運(yùn)算時(shí)會(huì)復(fù)制出新記錄來(lái)構(gòu)成新數(shù)據(jù)表,空間和時(shí)間成本都變大。

特別地,因?yàn)橛杏坞x記錄,離散數(shù)據(jù)集允許記錄的字段取值是某個(gè)記錄,這樣可以更方便地實(shí)現(xiàn)外鍵連接。

有序性

關(guān)系代數(shù)是基于無(wú)序集合設(shè)計(jì)的,集合成員沒(méi)有序號(hào)的概念,也沒(méi)有提供定位計(jì)算以及相鄰引用的機(jī)制。SQL 實(shí)踐時(shí)在工程上做了一些局部完善,使得現(xiàn)代 SQL 能方便地進(jìn)行一部分有序運(yùn)算。

離散數(shù)據(jù)集中的集合是有序的,集合成員都有序號(hào)的概念,可以用序號(hào)訪問(wèn)成員,并定義了定位運(yùn)算以返回成員在集合中的序號(hào)。離散數(shù)據(jù)集提供了符號(hào)以在集合運(yùn)算中實(shí)現(xiàn)相鄰引用,并支持針對(duì)集合中某個(gè)序號(hào)位置進(jìn)行計(jì)算。

有序運(yùn)算很常見(jiàn),卻一直是 SQL 的困難問(wèn)題,即使在有了窗口函數(shù)后仍然很繁瑣。SPL 則大大改善了這個(gè)局面,前面那個(gè)股票上漲的例子就能說(shuō)明問(wèn)題。

離散性與集合化

關(guān)系代數(shù)中定義了豐富的集合運(yùn)算,即能將集合作為整體參加運(yùn)算,比如聚合、分組等。這是 SQL 比 Java 等高級(jí)語(yǔ)言更為方便的地方。

但關(guān)系代數(shù)的離散性非常差,沒(méi)有游離記錄。而 Java 等高級(jí)語(yǔ)言在這方面則沒(méi)有問(wèn)題。

離散數(shù)據(jù)集則相當(dāng)于將離散性和集合化結(jié)合起來(lái)了,既有集合數(shù)據(jù)類(lèi)型及相關(guān)的運(yùn)算,也有集合成員游離在集合之外單獨(dú)運(yùn)算或再組成其它集合??梢哉f(shuō) SPL 集中了 SQL 和 Java 兩者的優(yōu)勢(shì)。

有序運(yùn)算是典型的離散性與集合化的結(jié)合場(chǎng)景。次序的概念只有在集合中才有意義,單個(gè)成員無(wú)所謂次序,這里體現(xiàn)了集合化;而有序計(jì)算又需要針對(duì)某個(gè)成員及其相鄰成員進(jìn)行計(jì)算,需要離散性。

在離散性的支持下才能獲得更徹底的集合化,才能解決諸如有序計(jì)算類(lèi)型的問(wèn)題。

離散數(shù)據(jù)集是即有離散性又有集合化的代數(shù)體系,關(guān)系代數(shù)只有集合化。

分組理解

分組運(yùn)算的本意是將一個(gè)大集合按某種規(guī)則拆成若干個(gè)子集合,關(guān)系代數(shù)中沒(méi)有數(shù)據(jù)類(lèi)型能夠表示集合的集合,于是強(qiáng)迫在分組后做聚合運(yùn)算。

離散數(shù)據(jù)集中允許集合的集合,可以表示合理的分組運(yùn)算結(jié)果,分組和分組后的聚合被拆分成相互獨(dú)立的兩步運(yùn)算,這樣可以針對(duì)分組子集再進(jìn)行更復(fù)雜的運(yùn)算。

關(guān)系代數(shù)中只有一種等值分組,即按分組鍵值劃分集合,等值分組是個(gè)完全劃分。

離散數(shù)據(jù)集認(rèn)為任何拆分大集合的方法都是分組運(yùn)算,除了常規(guī)的等值分組外,還提供了與有序性結(jié)合的有序分組,以及可能得到不完全劃分結(jié)果的對(duì)位分組。

聚合理解

關(guān)系代數(shù)中沒(méi)有顯式的集合數(shù)據(jù)類(lèi)型,聚合計(jì)算的結(jié)果都是單值,分組后的聚合運(yùn)算也是這樣,只有 SUM、COUNT、MAX、MIN 等幾種。特別地,關(guān)系代數(shù)無(wú)法把 TOPN 運(yùn)算看成是聚合,針對(duì)全集的 TOPN 只能在輸出結(jié)果集時(shí)排序后取前 N 條,而針對(duì)分組子集則很難做到 TOPN,需要轉(zhuǎn)變思路拼出序號(hào)才能完成。

離散數(shù)據(jù)集提倡普遍集合,聚合運(yùn)算的結(jié)果不一定是單值,仍然可能是個(gè)集合。在離散數(shù)據(jù)集中,TOPN 運(yùn)算和 SUM、COUNT 這些是地位等同的,即可以針對(duì)全集也可以針對(duì)分組子集。

SPL 把 TOPN 理解成聚合運(yùn)算后,在工程實(shí)現(xiàn)時(shí)還可以避免全量數(shù)據(jù)的排序,從而獲得高性能。而 SQL 的 TOPN 總是伴隨 ORDER BY 動(dòng)作,理論上需要大排序才能實(shí)現(xiàn),需要寄希望于數(shù)據(jù)庫(kù)在工程實(shí)現(xiàn)時(shí)做優(yōu)化。

有序支持的高性能

離散數(shù)據(jù)集特別強(qiáng)調(diào)有序集合,利用有序的特征可以實(shí)施很多高性能算法。這是基于無(wú)序集合的關(guān)系代數(shù)無(wú)能為力的,只能寄希望于工程上的優(yōu)化。

下面是部分利用有序特征后可以實(shí)施的低復(fù)雜度運(yùn)算:

1) 數(shù)據(jù)表對(duì)主鍵有序,相當(dāng)于天然有一個(gè)索引。對(duì)鍵字段的過(guò)濾經(jīng)常可以快速定位,以減少外存遍歷量。隨機(jī)按鍵值取數(shù)時(shí)也可以用二分法定位,在同時(shí)針對(duì)多個(gè)鍵值取數(shù)時(shí)還能重復(fù)利用索引信息

2) 通常的分組運(yùn)算是用 HASH 算法實(shí)現(xiàn)的,如果我們確定地知道數(shù)據(jù)對(duì)分組鍵值有序,則可以只做相鄰對(duì)比,避免計(jì)算 HASH 值,也不會(huì)有 HASH 沖突的問(wèn)題,而且非常容易并行。

3) 數(shù)據(jù)表對(duì)鍵有序,兩個(gè)大表之間對(duì)位連接可以執(zhí)行更高性能的歸并算法,只要對(duì)數(shù)據(jù)遍歷一次,不必緩存,對(duì)內(nèi)存占用很小;而傳統(tǒng)的 HASH 值分堆方法不僅比較復(fù)雜度高,需要較大內(nèi)存并做外部緩存,還可能因 HASH 函數(shù)不當(dāng)而造成二次 HASH 再緩存。

4) 大表作為外鍵表的連接。事實(shí)表小時(shí),可以利用外鍵表有序,快速?gòu)闹腥〕鲫P(guān)聯(lián)鍵值對(duì)應(yīng)的數(shù)據(jù)實(shí)現(xiàn)連接,不需要做 HASH 分堆動(dòng)作。事實(shí)表也很大時(shí),可以將外鍵表用分位點(diǎn)分成多個(gè)邏輯段,再將事實(shí)表按邏輯段進(jìn)行分堆,這樣只需要對(duì)一個(gè)表做分堆,而且分堆過(guò)程中不會(huì)出現(xiàn) HASH 分堆時(shí)的可能出現(xiàn)的二次分堆,計(jì)算復(fù)雜度能大幅下降。

其中 3 和 4 利用了離散數(shù)據(jù)集對(duì)連接運(yùn)算的改造,如果仍然延用關(guān)系代數(shù)的定義(可能產(chǎn)生多對(duì)多),則很難實(shí)現(xiàn)這種低復(fù)雜的算法。

除了理論上的差異, SPL 還有許多工程層面的優(yōu)勢(shì),比如更易于編寫(xiě)并行代碼、大內(nèi)存預(yù)關(guān)聯(lián)提高外鍵連接性能等、特有的列存機(jī)制以支持隨意分段并行等。

再把前面的問(wèn)題用 SPL 重寫(xiě)一遍有個(gè)直接感受。

一支股票最長(zhǎng)連續(xù)上漲多少天:

stock_price.sort(trade_date).group@i(closing_price《closing_price[-1]).max(~.len())

計(jì)算思路和前面的 SQL 相同,但因?yàn)橐肓擞行蛐院?,表達(dá)起來(lái)容易多了,不再繞了。

1 億條數(shù)據(jù)中取前 10 名:

T.groups(;top(-10,x))

SPL 有更豐富的集合數(shù)據(jù)類(lèi)型,容易描述單次遍歷上實(shí)施簡(jiǎn)單聚合的高效算法,不涉及大排序動(dòng)作。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3712

    瀏覽量

    64028
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67771

原文標(biāo)題:比SQL還好用,又一門(mén)國(guó)產(chǎn)數(shù)據(jù)庫(kù)語(yǔ)言誕生了

文章出處:【微信號(hào):cxuangoodjob,微信公眾號(hào):程序員cxuan】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫(kù)出現(xiàn)823錯(cuò)誤的數(shù)據(jù)恢復(fù)案例

    SQL Server數(shù)據(jù)庫(kù)故障: SQL Server附加數(shù)據(jù)庫(kù)出現(xiàn)錯(cuò)誤823,附加數(shù)據(jù)庫(kù)失敗。數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 09-20 11:46 ?114次閱讀
    <b class='flag-5'>數(shù)據(jù)庫(kù)</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—<b class='flag-5'>SQL</b> Server<b class='flag-5'>數(shù)據(jù)庫(kù)</b>出現(xiàn)823錯(cuò)誤的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    恒訊科技分析:sql數(shù)據(jù)庫(kù)怎么用?

    SQL數(shù)據(jù)庫(kù)的使用通常包括以下幾個(gè)基本步驟: 1、選擇數(shù)據(jù)庫(kù)系統(tǒng): 選擇適合您需求的SQL數(shù)據(jù)庫(kù)系統(tǒng),如MySQL、PostgreSQL、M
    的頭像 發(fā)表于 07-15 14:40 ?211次閱讀

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫(kù)所在分區(qū)空間不足報(bào)錯(cuò)的數(shù)據(jù)恢復(fù)案例

    SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)環(huán)境: 某品牌服務(wù)器存儲(chǔ)中有兩組raid5磁盤(pán)陣列。操作系統(tǒng)層面跑著SQL Server數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 07-10 13:54 ?303次閱讀

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—raid5陣列上層Sql Server數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)案例

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)環(huán)境: 5塊硬盤(pán)組建一組RAID5陣列,劃分LUN供windows系統(tǒng)服務(wù)器使用。windows系統(tǒng)服務(wù)器內(nèi)運(yùn)行了Sql Server數(shù)據(jù)庫(kù),存儲(chǔ)空間在操作系統(tǒng)層面劃分
    的頭像 發(fā)表于 05-08 11:43 ?395次閱讀
    <b class='flag-5'>數(shù)據(jù)庫(kù)</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—raid5陣列上層<b class='flag-5'>Sql</b> Server<b class='flag-5'>數(shù)據(jù)庫(kù)</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—ndf文件大小變?yōu)?KB的數(shù)據(jù)恢復(fù)案例

    存儲(chǔ)設(shè)備損壞導(dǎo)致存儲(chǔ)中SQL Server數(shù)據(jù)庫(kù)崩潰。對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行恢復(fù)后,用戶發(fā)現(xiàn)有4個(gè)ndf文件的大小變?yōu)?KB。該SQL Server數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 05-07 11:19 ?325次閱讀

    labview與sql數(shù)據(jù)庫(kù)連接5種方法

    連接LabVIEW和SQL數(shù)據(jù)庫(kù)是一種常見(jiàn)的需求,可以通過(guò)多種方法實(shí)現(xiàn)。本文將介紹五種連接LabVIEW和SQL數(shù)據(jù)庫(kù)的方法。 方法一:使用ADO.NET連接
    的頭像 發(fā)表于 01-07 16:01 ?3780次閱讀

    常見(jiàn)的存儲(chǔ)Idea數(shù)據(jù)庫(kù)的地方

    。它們使用表格和行的結(jié)構(gòu)來(lái)組織數(shù)據(jù),并使用SQL語(yǔ)言來(lái)查詢和管理數(shù)據(jù)。一些著名的關(guān)系型數(shù)據(jù)庫(kù)包括MySQL,Oracle,Microsoft
    的頭像 發(fā)表于 12-06 14:15 ?800次閱讀

    SQL Server數(shù)據(jù)庫(kù)備份方法

    SQL Server是一種用于管理和存儲(chǔ)數(shù)據(jù)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。備份數(shù)據(jù)庫(kù)是保護(hù)和恢復(fù)數(shù)據(jù)的重要措施之一,以防止意外
    的頭像 發(fā)表于 11-23 14:27 ?1196次閱讀

    sql數(shù)據(jù)庫(kù)入門(mén)基礎(chǔ)知識(shí)

    SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)是一種用于管理關(guān)系型數(shù)據(jù)庫(kù)的編程語(yǔ)言。它被廣泛應(yīng)用于企業(yè)應(yīng)用、數(shù)據(jù)
    的頭像 發(fā)表于 11-23 14:24 ?1622次閱讀

    navicat怎么導(dǎo)出數(shù)據(jù)庫(kù)文件

    。 首先,確保你已經(jīng)安裝了Navicat,并已成功連接到目標(biāo)數(shù)據(jù)庫(kù)。接下來(lái),按照以下步驟進(jìn)行導(dǎo)出數(shù)據(jù)庫(kù)文件: 步驟一:選擇目標(biāo)數(shù)據(jù)庫(kù) 在Na
    的頭像 發(fā)表于 11-21 10:53 ?7310次閱讀

    數(shù)據(jù)庫(kù)的clob類(lèi)型如何導(dǎo)入和導(dǎo)出

    的導(dǎo)入和導(dǎo)出操作時(shí),可以使用不同的方法和工具來(lái)實(shí)現(xiàn),具體取決于數(shù)據(jù)庫(kù)的類(lèi)型和版本。 一、導(dǎo)出CLOB類(lèi)型數(shù)據(jù) 在導(dǎo)出CLOB類(lèi)型數(shù)據(jù)時(shí),可以使用數(shù)據(jù)庫(kù)管理工具、編程
    的頭像 發(fā)表于 11-21 10:51 ?3929次閱讀

    mysql數(shù)據(jù)庫(kù)的增刪改查sql語(yǔ)句

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是許多網(wǎng)站和應(yīng)用程序的首選數(shù)據(jù)庫(kù)。在MySQL中,我們可以使用SQL(結(jié)構(gòu)化查詢語(yǔ)言)進(jìn)行數(shù)據(jù)
    的頭像 發(fā)表于 11-16 15:41 ?1020次閱讀

    什么是NoSQL?NoSQL數(shù)據(jù)庫(kù)的使用場(chǎng)景和架構(gòu)介紹

    NoSQL,全稱(chēng)為Not Only SQL,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。NoSQL有時(shí)也稱(chēng)作Not Only SQL的縮寫(xiě),是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)
    的頭像 發(fā)表于 11-09 11:01 ?1840次閱讀
    什么是NoSQL?NoSQL<b class='flag-5'>數(shù)據(jù)庫(kù)</b>的使用場(chǎng)景和架構(gòu)介紹

    sql是什么意思網(wǎng)絡(luò)用語(yǔ)

    sql是什么意思?sql是結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)的縮寫(xiě)。它是一種專(zhuān)門(mén)用于管理關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)的編程語(yǔ)言
    的頭像 發(fā)表于 10-13 17:31 ?3100次閱讀

    數(shù)據(jù)庫(kù)SQL的優(yōu)化

    數(shù)據(jù)庫(kù)執(zhí)行SQL都會(huì)先進(jìn)行語(yǔ)義解析,然后將SQL分成一步一步可執(zhí)行的計(jì)劃,然后逐步執(zhí)行。通過(guò)分析執(zhí)行計(jì)劃,我們可以清晰的看到數(shù)據(jù)庫(kù)執(zhí)行的操作,這對(duì)于
    的頭像 發(fā)表于 10-09 15:43 ?941次閱讀
    <b class='flag-5'>數(shù)據(jù)庫(kù)</b><b class='flag-5'>SQL</b>的優(yōu)化