99国产精品欲av蜜臀,可以直接免费观看的AV网站,gogogo高清免费完整版,啊灬啊灬啊灬免费毛片

網易首頁 > 網易號 > 正文 申請入駐

SQL(及存儲過程)跑得太慢怎么辦?

0
分享至

SQL 作為目前最常用的數據處理語言,廣泛應用于查詢、跑批等場景。當數據量較大時,使用 SQL(以及存儲過程)經常會發生跑得很慢的情況,這就要去優化 SQL。優化 SQL 有一些特定的套路,通常先要查看執行計劃來定位 SQL 慢的原因,然后針對性改寫來優化 SQL,比如對于連續數值判斷可以用 between 來替代 in,select 語句指明字段名稱,用 union all 替代 union,把 exists 改寫成 join 等。當然還有一些工程上的優化手段,如建立索引,使用臨時表 / 匯總表等,優化的方法有很多,相信各位 DBA 都不會陌生。

但遺憾的是,仍然有相當多情況無論怎樣優化都不可能跑得更快。這里 介紹了一些,并做了相應的技術分析。由于其理論基礎關系代數的局限,SQL 缺乏離散性和有序集合等特性的支持使得 SQL 在表達某些高性能算法時異常困難,甚至完全寫不出來,只能采用比較笨的低性能算法,眼睜睜地看著硬件資源被白白浪費。在 中有對 SQL 理論基礎缺陷的通俗解釋。也就是說,SQL 的慢是理論性的,這種問題僅僅由數據庫在工程層面優化只能局部改善(確實有不少商業數據庫能夠自動識別某些 SQL 并轉換成高性能算法),而不能根本地解決問題(情況復雜時數據庫優化引擎都會“暈”掉,只能按 SQL 的書寫邏輯執行成低性能算法)。理論性的缺陷當然也不能寄希望于更換數據庫而得到解決,只要還是用 SQL,即使采用分布式數據庫、內存數據庫也還是這種情況,在消耗更大成本的資源后當然也能有一定的性能提升,但和硬件本應能夠達到的性能仍然有巨大的差距。

那還能怎么辦?

那就不能再用 SQL!也就不能再用關系數據庫了。

那用什么?

SQL 描述不了這些高性能算法,用 Java,C++ 行嗎?

沒問題!從理論上講,Java、C++ 什么算法都能實現,而且因為可以控制計算機底層的動作,這類代碼通常可以跑出很好的速度(只要程序員能力不是太差)。

不過,不要高興得太早,雖然都寫得出來,但由于這些開發語言過于原生,本身沒有提供什么面向數據處理的高性能計算類庫,想實現這些算法就必須從頭實現,而這恐怕要累死。以哈希關聯為例,Java 實現至少要寫幾百行代碼,不僅要設計合適的哈希函數,還要解決可能出現的哈希沖突,這一套下來的工程量可不小;還有在 Java 中進行多線程編程也并非易事,但并行計算又是提升計算性能的有效手段。類似的,涉及結構化數據計算的算法還有很多,這些都自己來做的復雜度可想而知。如果一個計算的實現過于復雜,其開發代價已經遠遠超過性能優化本身,那也就沒有優化的意義了。

Python 也面臨類似的問題,雖然在結構化數據計算類庫方面要比 Java 豐富得多,但并沒有提供必要的高性能算法庫和存儲方案,比如沒有提供為大數據服務的游標類型及相關運算,也沒提供有效的并行機制。想要實施那些高性能算法也只能自己開發,但 Python 作為解釋執行語言,本身運行效率不高,在此基礎上再開發的算法也往往達不到高性能要求。同樣,Scala 也缺乏足夠的高性能計算類庫,自己編寫的算法同樣復雜度相當高,對于不熟悉這些算法的程序員來講,從頭實現的代碼的運行效率往往還不如努力優化后商用數據庫 SQL 的速度。

那就只能忍受 SQL 的慢了嗎?

還可以用 SPL!

SPL 和高性能

開源 SPL(Structured Process Language),一個專門面向結構化數據處理的程序語言。使用 SPL 可以讓原本 SQL 跑得慢的計算變快。

為什么 SPL 能跑得快?是擁有了什么改變硬件性能的黑科技嗎?

那倒沒有。軟件改變不了硬件的計算性能,SPL 也一樣。簡單來說,SPL 快就是上面說的,要使用更高性能的算法。SPL 中提供了大量基礎的高性能算法類庫,基于這些算法庫實現的代碼可以有效減少計算量,而我們做計算就是組合運用這些算法,每種計算都快一些,那整體上就會快很多,從而達到提升計算性能的目的。

SPL 設計的這些高性能算法,像遍歷復用、有序歸并、外鍵預關聯、標簽位維度、并行計算等,都已經封裝好。這其中有很多算法都是 SPL 獨創的,在業內也是首次出現。


基于這些封裝好的算法庫,再寫程序會就很方便,拿來直接用而不需要從頭自己開發,不僅性能高,開發也快。從這個角度來看,跑得快和寫著簡單其實是一回事,就是能高效率地編寫高性能算法。反觀 Java、C++、Python、Scala 由于缺少這些算法庫,想要實現高性能也就很難了。

這里有一些 SPL 中高性能算法的例子及與 SQL 的對比用例:

SPL 采用和 SQL 不同的觀念看待同一個計算任務,繼而可以采用不同(更低)復雜度的計算方法。

在實戰中,SPL 目前已經做過不少性能優化案例,少則提速數倍,多則數十倍,極端情況還有提速上千倍的,提速一個數量級基本上是常態。

比如在優化某保險公司車險保單跑批的案例( )中,使用 SPL 將計算時間從 2 小時縮短到 17 分鐘,同時代碼量減少了 2/3。這里使用了 SPL 特有的遍歷復用技術,可以在對大數據的一次遍歷過程中實現多種運算,有效地減少外存訪問量。這個案例涉及對一個大表進行三次關聯和匯總的運算,使用 SQL 要將大表遍歷三次,而使用 SPL 只需要遍歷一次,并在關聯運算上也采用了不同的方法,因此獲得了巨大的性能提升。

還有在 的案例中,使用 SPL 將原本只能預關聯的手機賬戶查詢變成實時關聯,同時服務器數量從 6 臺降為 1 臺。這里充分利用了 SPL 的有序存儲機制,一次性讀取整個賬戶數據時可以有效減少硬盤時間(物理存儲連續),再借助區分維表和事實表的外鍵實時關聯技術使用單機就能完成實時關聯查詢,性能提升明顯,硬件需求也降低了許多。

這里還整理了一些常見的業務場景,可以利用 SPL 的算法庫來實現的高性能:

關于 SPL 高性能的原因在 里也進行了詳細分析,并給出了更多實際優化案例供參考。

進一步討論

說到這里你可能會想,那是不是學會 SPL 語法就能把計算跑得快了?

也沒這么簡單!

關于算法

使用 SPL 可以獲得更高性能不是因為 SPL 語法,SPL 語法雖然有些特色,但并不是跑得快的根本原因。最關鍵的是掌握和運用高性能算法

實現性能優化有兩步:第一步設計出低復雜的計算方案,第二步用足夠低的成本實現它。其中更關鍵的是第一步,這需要由有一定經驗和知識儲備的程序員來做(即掌握和運用高性能算法),第二步才是用 SPL 來做。換句話說,SPL 并不負責設計解決問題的方法,而只是負責讓解法更容易實現出來。

SPL 語法很簡單,比 Java 容易得多,兩小時就能基本上手,兩三周就能比較熟練了。但算法卻沒那么簡單,需要認真學習反復練習才能掌握。反過來,只要掌握了算法,用什么語法就是個相對次要的問題了(當然用 SQL 這種太粗線條的語言還是不行)。這就像給病人看病,找出病理原因后,能分析出什么成分的藥能管用。無論直接購買成藥(使用封裝過的 SPL),還是上山采藥(使用 Java/C++ 硬寫),都可以治好病,無非就是麻煩程度和支付成本不同。

因為實際中很少使用,有不少應用程序員工作幾年后都把大學時代學過的數據結構和算法課程內容忘了,而不理解這些基礎算法知識時也就沒辦法設計出高性能算法方案。為此,SPL 設置了專門的高性能專題,不僅涵蓋高性能算法與優化技巧,還有性能優化課程與性能圖書來授人以漁。

高性能計算專題
http://c.raqsoft.com.cn/article/1647044897121

性能優化圖書
http://c.raqsoft.com.cn/article/1613911172557

性能優化課程
http://www.raqsoft.com.cn/wx/course-performance-optimizing.html

關于存儲

和算法密切相關的,高性能計算還有一個關鍵點是數據存儲,高性能計算離不開合理的數據存儲方式。使用 SPL 實施高性能計算時也不能再基于數據庫來做,需要將數據從數據庫里搬出來重新組織。

為什么呢?

慢的數據計算任務可以分為計算密集型和數據密集型兩大類。單純的計算密集型任務涉及的數據量不大而只是計算量很大,計算量大并不是由于數據量大造成的,這樣不用改變存儲方式,只要實施了好的計算方法也能大幅提升性能,也就是說,可以繼續在原有的存儲方式(比如數據庫)上使用 SPL 來優化性能。而數據密集型任務涉及的計算量也很大,但計算量大主要是由數據量大造成的,這時候如果不改變存儲方式,數據讀取時間很可能會很長,即使能把計算時間優化到 0,整體運算時間也不能得到有效的優化。

遺憾的是,我們面臨的計算慢的場景絕大部分屬于數據密集型計算。如果數據還存在數據庫中,而數據庫取數接口(如 JDBC)通常又非常慢,將數據讀出就要消耗很長時間(IO 效率很低),經常遠遠超過后續 SPL 計算的時間,這也就不可能達到優化效果了。而且,SPL 中有相當多的算法也對存儲組織有要求,比如單邊分堆算法就要求有序的存儲方式,而常規關系數據庫無法滿足這個前提,這些算法也無法實施了。

為了解決這個問題,SPL 提供了自有的存儲機制,直接采用文件系統,將數據從數據庫導出到特定格式的文件中,不僅可以獲得更高的 IO 存取效率以及文件系統靈活的管理能力,還可以充分利用自有格式的列存、有序、壓縮、并行分段等數據存儲優勢,從而高效地發揮高性能算法效力。

使用文件存儲數據還可以有效減少數據入庫的時間,進一步提升計算性能。有些計算場景不僅要從數據源讀,還要將計算結果落地,存入數據庫以方便后續計算使用。像 ETL 就是典型的讀寫并存的計算,還有某些大數據計算或復雜計算需要將中間結果暫存,后續計算還需要再使用的情況。我們知道,數據庫寫入是非常慢的動作,伴隨寫入的計算場景性能自然低下。這時就可以將原本需要入庫的數據存儲在文件中(雖然這是工程方面的優勢,但仍可獲得接近數量級的讀寫性能提升),再利用 SPL 的文件計算能力直接計算,從而實現高性能。

關于 T+0

如果把數據都移到數據庫外,那么是不是就無法完成實時數據計算了?畢竟數據總是在不斷地產生。

沒有問題。

對于全量 T+0 實時查詢,SPL 提供了多源混合計算的能力以滿足這類場景。冷數據量大且不再變化使用 SPL 的高性能文件存儲,這樣可以獲得更高地計算性能;熱數據量小仍然存放在原有數據源中,SPL 直接讀取計算(支持多樣性數據源),由于熱數據量并不大,直接基于生產數據源查詢也不會對其造成太大影響,訪問時間也不會太長。冷熱數據混合計算,就可以獲得針對全量數據的 T+0 實時查詢。我們只要定期將變冷的數據固化到 SPL 的高性能存儲中,原數據源只需要保持少量近期新產生的熱數據即可。整體架構如下:


如何開始

從前面的分析可以知道,完成性能優化任務必須熟悉高性能算法和存儲機制,但從上面的課程圖書也可以看出來,這些內容并不少,都要融會貫通也不是很容易的事。特別是很多程序員都習慣了 SQL 的思維方式,很難跳出這個窠臼。面對一個性能優化任務,即使有了開源 SPL 這樣的有利武器,也常常有點無從下手。打個比方,一個趕馬車的高手想跑得更快時,會習慣于尋找韁繩和鞭子,而對于初次見到的汽車上的方向盤和油門卻會感到一頭霧水。

為此,SPL 團隊也提供相應的咨詢服務:你可以把遇到的性能問題拿過來與我們一起討論和設計優化方案,必要的時候還可以進行 POC。

我們通常關心這樣一些必要的問題信息:業務場景、面臨痛點、當前計算的數據量和并發量以及響應時間,如果還能提供 SQL 腳本、表結構和測試數據就更好了。留個郵箱方便交流: spl@scudata.com 。

相信我們,從不失手!

經歷過一兩個案子,程序員們就會熟悉 SPL 的思維方式(理解了方向盤和油門),以后再自己做性能優化就不是問題了。

天下武功,唯快不破,但只有掌握了快的本質和方法才能所向無敵。你說是不是?

重磅!開源SPL交流群成立了

簡單好用的SPL開源啦!

為了給感興趣的技術人員提供一個相互交流的平臺,

特地開通了交流群(群完全免費,不廣告不賣課)

需要進群的朋友,可長按掃描下方二維碼

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
留學圈的話到底有多炸裂?網友:在日本生活5年,我陪她墮了3次胎

留學圈的話到底有多炸裂?網友:在日本生活5年,我陪她墮了3次胎

解讀熱點事件
2025-07-23 00:10:03
易中天:不殺,留著終是個危險

易中天:不殺,留著終是個危險

尚曦讀史
2025-07-23 01:45:02
特朗普這話一出,菲律賓總統臉色變了....

特朗普這話一出,菲律賓總統臉色變了....

環球時報新聞
2025-07-23 11:38:05
曝山東男籃簽下奧拉迪波,邱彪這是在干啥?難怪楊鳴出言不遜

曝山東男籃簽下奧拉迪波,邱彪這是在干啥?難怪楊鳴出言不遜

姜大叔侃球
2025-07-23 16:14:29
2025年高考分數線猛跌的4所211大學,400多分成功撿漏,實屬罕見

2025年高考分數線猛跌的4所211大學,400多分成功撿漏,實屬罕見

教育導向分享
2025-07-22 19:25:20
我是正師級軍官,參加同學聚會被初戀嘲笑,第二年我轉業任副市長

我是正師級軍官,參加同學聚會被初戀嘲笑,第二年我轉業任副市長

喬生桂
2025-07-22 17:09:49
涼爽倒計時!湖北連發38條預警,即將重回40℃!

涼爽倒計時!湖北連發38條預警,即將重回40℃!

極目新聞
2025-07-23 12:31:27
首次,2名中國大陸出身的華人當選為日本參議院議員

首次,2名中國大陸出身的華人當選為日本參議院議員

徐靜波靜說日本
2025-07-23 07:24:02
梁朝偉和湯唯在《色戒》里“假戲真做”?網友爆出截圖:一目了然

梁朝偉和湯唯在《色戒》里“假戲真做”?網友爆出截圖:一目了然

姜糖先生
2025-06-08 19:31:00
央視曝光!你以為沒壞實際早已“細菌爆表”的5種食物,趕緊扔了

央視曝光!你以為沒壞實際早已“細菌爆表”的5種食物,趕緊扔了

阿傖說事
2025-07-22 08:00:09
二手房拋售狂潮席卷全國:我們制造史詩級變革?將會有什么結果

二手房拋售狂潮席卷全國:我們制造史詩級變革?將會有什么結果

小白鴿財經
2025-07-21 08:36:15
“絕經和出道同時來?”上海街頭驚現她的巨幅海報!網友:笑著笑著就哭了

“絕經和出道同時來?”上海街頭驚現她的巨幅海報!網友:笑著笑著就哭了

環球網資訊
2025-07-23 10:48:19
免費領雞蛋,騙244億養老錢!中國老年人“第一大忽悠”終于倒了

免費領雞蛋,騙244億養老錢!中國老年人“第一大忽悠”終于倒了

新語愛八卦
2025-07-22 17:59:09
5年7500萬!曝比亞迪已暫停贊助國足:因大量球迷抵制國足贊助商

5年7500萬!曝比亞迪已暫停贊助國足:因大量球迷抵制國足贊助商

風過鄉
2025-07-22 20:57:26
實錘?網傳杜建英有丈夫,還有一個36歲大兒子,宗慶后竟然是三哥

實錘?網傳杜建英有丈夫,還有一個36歲大兒子,宗慶后竟然是三哥

壹月情感
2025-07-20 22:06:40
NBA歷史僅10人能在出戰400+場比賽保持70+%勝率 小卡是現役唯一

NBA歷史僅10人能在出戰400+場比賽保持70+%勝率 小卡是現役唯一

直播吧
2025-07-23 19:09:16
宗馥莉叔叔宗澤后接受巴倫中文網獨家采訪,又爆出猛料,令人深思

宗馥莉叔叔宗澤后接受巴倫中文網獨家采訪,又爆出猛料,令人深思

悠閑歷史
2025-07-23 15:55:02
北京化工大學碳纖維錄取通知書能切西瓜,學校招生辦:本科生專屬,明年不再沿用

北京化工大學碳纖維錄取通知書能切西瓜,學校招生辦:本科生專屬,明年不再沿用

極目新聞
2025-07-23 13:36:32
宮魯鳴或卸任,女籃新帥或敲定,62歲,名宿,或成李夢回歸關鍵

宮魯鳴或卸任,女籃新帥或敲定,62歲,名宿,或成李夢回歸關鍵

東球弟
2025-07-23 11:10:02
央視曝光!又一灰色產業鏈暴雷!0成本套現48萬,還不用還?

央視曝光!又一灰色產業鏈暴雷!0成本套現48萬,還不用還?

大魚簡科
2025-07-23 16:17:38
2025-07-23 20:08:49
Meta
Meta
關注java進階架構師送架構
1059文章數 9856關注度
往期回顧 全部

科技要聞

別自嗨了!XREAL徐馳:AI眼鏡只有5歲智商

頭條要聞

印度、孟加拉關切雅魯藏布江下游水電站工程 中方回應

頭條要聞

印度、孟加拉關切雅魯藏布江下游水電站工程 中方回應

體育要聞

英格蘭最紅球星 也是加勒比島國驕傲

娛樂要聞

汪峰森林北同游日本 各帶各娃互不耽誤

財經要聞

律師解析娃哈哈遺產案:遺囑是最大變數

汽車要聞

德系大招放盡 場地極限測試全新奧迪A5L

態度原創

數碼
房產
旅游
手機
公開課

數碼要聞

全漢帶來 VIC GD 系列電源:僅擁有 3 年質保的金牌非模組 ATX

房產要聞

海南自由貿易港全島封關,2025年12月18日正式啟動!

旅游要聞

熱聞|清明假期將至,熱門目的地有哪些?

手機要聞

主流安卓品牌中,誰兼容蘋果生態最好?

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 方正县| 新竹市| 天长市| 浪卡子县| 恩平市| 德兴市| 鞍山市| 香河县| 红安县| 永福县| 合水县| 台东市| 垦利县| 新丰县| 天峨县| 临颍县| 开平市| 南康市| 泰顺县| 天镇县| 静海县| 安龙县| 安溪县| 北辰区| 临潭县| 宜宾县| 罗田县| 呼图壁县| 浪卡子县| 安远县| 西和县| 石台县| 伊宁县| 桂阳县| 栾城县| 沙洋县| 纳雍县| 仙居县| 赣榆县| 晋宁县| 定西市|