精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

提高分層 SQL 結構的性能

譯文 精選
數據庫 SQL Server
分層表結構性能速度很慢,本文將學習列傳播,以幫助解決與分層表結構相關的典型性能問題。

?譯者 | 萬望琳

審校 | 孫淑娟 梁策

本文將展示在處理分層數據結構時,列傳播這一直接提高查詢性能的方法。本文將使用基于數據驅動項目的真實場景來講解,其中項目為某體育行業初創公司開發的實時數據網站。本文將帶你了解有關列傳播的相關知識,以解決分層 SQL 表結構中固有的性能問題。

背景

本文所做項目涉及一個擁有數百萬頁面的足球球迷網站。該網站致力于成為球迷心中的權威,尤其是在投注方面。因為調度程序負責定期重新計算復雜數據并將其存儲在表中,這樣查詢就不必涉及SQL 聚合,數據庫和應用程序架構也不是特別復雜。因此,真正的挑戰在于非功能性需求,例如性能和頁面加載時間。

應用領域

體育行業的數據來源有很多,每個來源都為其客戶提供不同的數據集。具體來說,足球行業有四種類型的數據:

  1. 個人檔案數據:身高、體重、年齡、效力球隊、所獲獎杯、個人獎項、球員和教練。
  2. 歷史數據:過往賽果和技術統計,如進球、助攻、黃牌、紅牌、傳球等。
  3. 當前和未來數據:當前賽季已完結和將進行的比賽結果與技術統計。
  4. 實時數據:比賽實時結果與技術統計。

該網站涉及所有這些類型的數據,同時特別關注有利于搜索引擎優化的歷史數據和支持投注的實時數據。

分層表結構

出于保密要求,部分數據結構無法完全公開。但通過足球賽季的結構也可以了解相關情況。

具體來說,足球提供商通常按如下方式組織賽季中的比賽數據:

  • 賽季(Season):有開始和結束日期,通常持續一個日歷年。
  • 賽事(Competition):比賽所屬的賽事。
  • 階段(Phase):賽事所處的階段(例如,資格賽、淘汰賽、決賽階段)。每個賽事都有自己的規則,很多賽事只有一個階段。
  • 組別(Group):與階段相關的組(例如,A 組、B 組、C 組……)。像世界杯等賽事會涉及不同的組別,每個組內涵蓋相應球隊。大多數賽事只有一個通用組適用于所有球隊。
  • 回合(Turn):是從邏輯上相對于進行一天的賽事而言的。通常持續一周,涵蓋屬于一個小組的所有球隊的比賽(例如,MLS 有 17 場主場比賽和 17 場客場比賽,因此它有 34 個回合)。
  • 比賽(Game):兩支足球隊之間的比賽。

如下圖ER 模式所示,這 5 張表代表了一個分層數據結構:

技術、參數和性能要求

我們使用Express 4.17.2和 Sequelize 6.10作為 ORM(對象關系映射)在 Node.js 和 TypeScript 中開發后端。前端是使用 TypeScript 開發的 Next.js 12應用程序。數據庫則選用由 AWS 托管的 Postgres 服務器。

該網站在AWS Elastic Beanstalk上運行,前端有 12 個實例,后端有 8 個實例,目前每天有 1000到 5000的訪問者??蛻舻哪繕耸窃谝荒陜冗_到每天6萬的瀏覽量,因此該網站必須準備好在無損性能的情況下托管數百萬月度用戶。

在Google Lighthouse測試中,該網站應性能、SEO 和可訪問性方面得分超過了80。此外,加載時間應始終小于 2 秒,理想情況下為幾百毫秒。真正的挑戰在于,該網站包含超過 200 萬個頁面,預渲染它們都需要數周時間。此外,大多數頁面上顯示的內容都不是靜態的。因此,我們選擇了增量靜態再生方法。當訪問者點擊一個沒有人訪問過的頁面時,Next.js 會使用從后端公開的 API 檢索到的數據生成它。然后,Next.js 將頁面緩存 30 或 60 秒,具體取決于頁面的重要性。

因此,后端必須快速為服務器端生成過程提供所需的數據。

為什么查詢分層表很慢

現在讓我們看看為什么分層表結構會帶來性能挑戰。

JOIN 查詢速度很慢

根據與層次結構中較高對象關聯的參數過濾葉子是分層數據結構中的一個常見場景。比如,檢索在特定賽季中進行的所有比賽。由于葉表Game不直接連接到Season,因此你必須執行一個與層次結構中的元素一樣多的 JOIN 的查詢。

因此你可能會編寫以下查詢:

SELECT GA.* FROM `Game` GA
LEFT JOIN `Turn` T on GA.`turnId` = T.`id`
LEFT JOIN `Group` G on T.`groupId` = G.`id`
LEFT JOIN `Phase` P on G.`phaseId` = P.`id`
LEFT JOIN `Competition` C on P.`competitionId` = C.`id`
LEFT JOIN `Season` S on C.`seasonId` = S.`id`
WHERE S.id = 5

這樣的查詢就會很慢。每個 JOIN 都會執行一次笛卡爾積運算,這需要時間并且可能會產生數千條記錄。因此,分層數據結構越長,性能就越差。

此外,如果你想檢索所有數據而不僅僅是表中的Game列,由于笛卡爾積的性質,你必須處理數千行和數百列。這個過程可能會變得混亂,但這正是 ORM 發揮作用的地方。

ORM數據解耦和轉換需要時間

通過 ORM 查詢數據庫時,你可能會對檢索基于應用程序級別的表中的數據感興趣。原始數據庫級別表示在應用程序級別可能沒有用。因此,當大多數高級 ORM 執行查詢時,它們會從數據庫中檢索所需數據并將其轉換為應用程序級表示。這個過程包括兩個步驟:數據解耦和數據轉換。

在后臺,來自 JOIN 查詢的原始數據首先被解耦,然后在應用程序級別轉換為相應的表示。因此,在處理所有數據時,具有數百列的數千條記錄成為一個小組數據,每個數據都具有數據模型類中定義的屬性。因此,包含從數據庫中提取的原始數據的數組將成為一組Game對象。每個Game對象都有一個包含其各自Turn實例的turn字段。然后,該Turn對象將有一個Group字段存儲其各自的Group對象等。

生成這種轉換后的數據是無法擺脫的負擔。處理凌亂的原始數據具有挑戰,并且會導致代碼異味。另一方面,這個后臺發生的過程需要時間。因為處理存儲數千個元素的數組總是非常棘手,當原始記錄有數千行時尤其如此。

換句話說,分層表結構的常見 JOIN 查詢在數據庫和應用程序層都很慢。

列傳播作為一種解決方案

針對這一性能問題,在分層結構將列從父級傳播到其子級可以作為一種解決方案。

為什么應該在分層數據庫上傳播列

在分析上面的 JOIN 查詢時,很明顯問題在于在葉子表Game應用了過濾器。你必須遍歷整個層次結構。但是既然 Game 是層次結構中最重要的元素,為什么不直接在其中添加seasonId、competitionId、phaseId和groupId列呢?這就是列傳播的意義所在。

將外部鍵列直接傳播給子項可以避免所有的 JOIN。現在你可以將上面的查詢替換為以下查詢:

SELECT * FROM `Game` GA
WHERE GA.seasonId = 5

可以想見,這個查詢會比原來的查詢快得多。此外,它會直接返回你感興趣的內容。因此,ORM 數據解耦和轉換過程現在也可以忽略了。

請注意,列傳播涉及數據重復,需要少用、慎用。在深入研究如何優雅實現之前,讓我們看看應該傳播哪些列。

如何選擇要傳播的列

如果向下傳播層次結構中較高的實體的每一列,這在過濾方面可能很有用(例如外部密鑰)。此外,你也可用傳播用于過濾數據的枚舉列,或生成包含來自父級的聚合數據的列來避免 JOIN。

Top 3- 列傳播方法

在選擇列傳播方法時,我們的團隊考慮了三種不同的實現方法。

1. 創建物化視圖

要在層次表結構中實現列傳播,我們首先是想創建具有所需列的物化視圖。物化視圖存儲查詢的結果,它通常表示復雜查詢的行和/或列的子集,例如上面介紹的 JOIN 查詢。

當涉及到具體化查詢時,你可以定義何時生成視圖。然后數據庫會將其存儲在磁盤上并使其像普通表一樣可用。即使生成查詢可能很慢,你也只能一點點地啟動它。因此,物化視圖代表了一種快速的解決方案。

另一方面,物化視圖對處理實時數據可能并非最佳方法,因為物化視圖可能不是最新的。它存儲的數據取決于你決定生成視圖或刷新它的時間。此外,涉及大數據的物化視圖會占用大量磁盤空間,這可能會帶來問題并增加存儲成本。

2. 定義虛擬視圖

另一種可能的解決方案是使用虛擬視圖。同樣,虛擬視圖是存儲查詢結果的表。與物化視圖的不同之處在于,這一次數據庫不會將查詢結果存儲在磁盤上,而是將其保存在內存中。因此,虛擬視圖始終是最新的,從而解決了實時數據的問題。

此外,每次訪問視圖時,數據庫都必須執行生成查詢。所以,如果生成查詢需要時間,那么涉及到視圖的整個過程必然很慢。虛擬視圖是一個強大的工具,但考慮到我們的性能目標,還需尋找其他解決方案。

3. 使用觸發器

SQL 觸發器可以讓你在數據庫中發生特定事件時自動啟動查詢。換句話說,觸發器使你能夠跨數據庫同步數據。因此,在層次結構表中定義所需的列,并讓自定義觸發器更新它們,這樣就可輕松實現列傳播。

因為每次觸發器等待的事件發生時,數據庫都會執行它們,所以可以想見,觸發器會增加性能開銷。執行查詢需要時間和內存,所以會有成本,但與虛擬或物化視圖帶來的缺點相比,這種成本通??梢院雎圆挥嫛?/p>

觸發器的問題是,定義它們可能需要一些時間。同時,你只能處理此任務一次,并在需要時要對其更新。通過觸發器可以讓你輕松實現列傳播。此外,通過這種方式,我們也極大滿足了客戶定義的性能要求。

層次結構在數據庫中很常見。因為需要長時間的 JOIN 查詢和 ORM 數據處理,過程緩慢且耗時。如果處理不當,可能會導致應用程序出現性能和效率低下的問題。不過,你可以在層次結構中將列從父級傳播到的子級來避免這些問題。

譯者介紹

萬望琳,51CTO社區編輯,資深DBA工程師,具有十余年DBA以及系統運維經驗,曾就職于南網/合生創展等,目前就職于某大型跨國銀行。擁有豐富的系統、Oracle數據庫等維護經驗,IT基礎架構背景,獲得阿里云ACE,CKA,RHCE以及Oracle OCP等認證。擅長領域有Oracle,Ansible,Linux,系統架構,云原生等。

原文標題:??Improving Performance in a Hierarchical SQL Structure???,作者:Antonello Zanini?

責任編輯:華軒 來源: 51CTO
相關推薦

2011-04-01 15:36:24

索引SQL Server

2011-07-07 14:22:24

SQL查詢update

2010-07-16 13:48:08

SQL Server合

2010-06-22 10:00:31

SQL查詢

2014-09-10 17:26:26

LTE空中接口

2011-05-24 15:15:12

mysql性能

2020-05-19 13:40:38

SQL數據庫三板斧

2010-07-26 09:34:24

SQL Server性

2010-07-16 11:30:06

SQL Server

2010-07-15 15:25:15

SQL Server性

2011-04-02 13:37:05

SQL Server 索引視圖

2011-07-08 17:49:38

WITH ASCTE

2010-10-21 10:42:30

SQL Server查

2012-11-27 10:21:25

無線技術WLANAP

2020-10-13 09:56:36

數據中心混合云技術

2010-04-14 15:22:53

Oracle JDBC

2021-07-14 14:06:06

CSS前端瀏覽器

2011-04-11 14:56:09

Oracle性能

2023-04-28 14:54:57

架構開發React

2010-08-18 09:42:11

DB2性能調優
點贊
收藏

51CTO技術棧公眾號

成人在线免费观看网站| 精品捆绑调教一区二区三区| 国产九色精品成人porny | 色呦呦在线视频| 91在线精品秘密一区二区| 国产精品久久久久久网站| 亚洲人与黑人屁股眼交| 麻豆成人入口| 欧美精品乱人伦久久久久久| 欧美一区二区三区四区高清| 中文字幕精品久久久久| av网址在线观看免费| 国产精品四虎| av中文字幕亚洲| 国产欧美日韩精品丝袜高跟鞋| 久久老司机精品视频| 波多野结衣的一区二区三区| 精品免费国产一区二区三区四区| 91人人澡人人爽人人精品| 青草在线视频在线观看| 中文字幕乱码日本亚洲一区二区| 国产成人看片| 国产伦精品一区二区三区四区| 国产一区二区中文| 日韩在线视频二区| 国产男男chinese网站| 999在线精品| 欧美日本一区二区在线观看| 久久美女福利视频| 女囚岛在线观看| 日韩一区在线免费观看| 欧美日韩在线精品| 天天操天天射天天| 国产精品影音先锋| 成人免费自拍视频| 中文字幕一区二区三区免费看| 国产精品综合色区在线观看| 久久久久国色av免费观看性色| 国产激情无码一区二区三区| 欧洲乱码伦视频免费| 日韩精品一区二区三区第95| 国产伦精品一区二区免费| 日韩视频一区二区三区四区| 欧美日韩成人一区| 天堂一区在线观看| 久久久人成影片一区二区三区在哪下载 | 91嫩草在线| 国产女人18毛片水18精| 激情综合五月天| 国产日韩在线视频| 亚洲综合网av| 精品制服美女久久| 国产一区二区在线免费| 亚洲一区二区天堂| 久久99久久精品| 国产日韩欧美视频在线| 怡春院在线视频| 麻豆精品新av中文字幕| 国产欧美精品日韩精品| 一级特黄aaa大片| 久久成人免费网| 91夜夜未满十八勿入爽爽影院 | 一区二区三区四区| 午夜视频成人| 亚洲欧美日韩国产综合在线| 黑人巨大国产9丨视频| 精品黄色免费中文电影在线播放| 自拍偷拍欧美精品| 人妻av无码专区| 超碰在线中文字幕| 狠狠色狠色综合曰曰| 国产精品亚洲αv天堂无码| jizz欧美| 8x8x8国产精品| 国产精品果冻传媒| 四虎884aa成人精品最新| 亚洲日本成人网| 国产主播av在线| 女人色偷偷aa久久天堂| 97视频com| 91黑人精品一区二区三区| 蜜桃视频第一区免费观看| 91久久精品国产91性色| 欧美天堂在线视频| 国产日韩精品一区| eeuss中文| 理论片午夜视频在线观看| 色综合色狠狠天天综合色| 午夜免费看视频| 98视频精品全部国产| 亚洲天堂av女优| 国产美女福利视频| 另类国产ts人妖高潮视频| 国产日韩综合一区二区性色av| 精品国产av一区二区| 久久综合九色综合欧美亚洲| 亚洲国产欧美一区二区三区不卡| 50度灰在线| 色综合色综合色综合色综合色综合| 中文字幕第17页| 美国十次av导航亚洲入口| 最新国产成人av网站网址麻豆| 久久久久亚洲av片无码下载蜜桃 | 亚洲黄色片免费| 欧美理伦片在线播放| 色婷婷综合久久久久| 日韩黄色精品视频| 国产一区二区三区四| 久久精品中文字幕一区二区三区 | 欧美熟女一区二区| 国产精品久久久一区麻豆最新章节| 国产freexxxx性播放麻豆| 日本高清不卡一区二区三区视频| 日韩视频一区二区三区在线播放 | 成人一区二区| 4388成人网| 亚洲av无码乱码国产精品| 国产免费久久精品| 六月丁香激情网| 激情久久免费视频| 中文字幕日韩免费视频| 在线观看亚洲天堂| 国产成人免费视频网站高清观看视频| 日韩欧美精品一区二区| av免费不卡国产观看| 欧美日韩高清影院| 国产特级黄色录像| 一区二区三区福利| 国产精品一区二区三区在线| av免费网站在线| 欧美男男青年gay1069videost | 91精品国产乱码久久久久久久| 国产v综合ⅴ日韩v欧美大片| 婷婷丁香花五月天| 亚洲一二三四久久| 男人添女人荫蒂国产| 天天插综合网| 成人欧美一区二区三区在线湿哒哒| av在线播放网站| 在线看不卡av| 欧美人妻一区二区三区| 久久精品导航| 欧美精品欧美精品| 亚洲精品一区| 亚洲欧美国产高清va在线播| 国产又大又黄视频| 久久人人97超碰com| 午夜肉伦伦影院| 啪啪激情综合网| 97精品一区二区三区| 日本毛片在线观看| 丰满岳妇乱一区二区三区| 9.1成人看片| 久久高清免费观看| 亚洲欧美99| 欧美大陆国产| 超碰精品一区二区三区乱码| 国产成人三级在线播放| 亚洲伊人色欲综合网| 久久久高清视频| 国产精品久久久久毛片大屁完整版 | 久久777国产线看观看精品| www.成人免费视频| 亚洲国产精品影院| 偷拍女澡堂一区二区三区| 天堂久久一区二区三区| 亚洲日本japanese丝袜| 日韩三级不卡| 欧美在线激情网| 成年人视频在线看| 91精品国产综合久久久久久| 久久中文字幕无码| 99久久99久久久精品齐齐| 嫩草av久久伊人妇女超级a| 色偷偷综合网| 国产高清不卡av| 欧美天堂视频| 久久久国产精品亚洲一区| 亚洲精品第五页| 欧美体内谢she精2性欧美| 日韩欧美黄色网址| 国产精品91xxx| 国产乱子伦农村叉叉叉| 日产午夜精品一线二线三线| 91视频婷婷| 亚洲午夜天堂| 久久亚洲一区二区三区四区五区高| 人妻精品一区二区三区| 欧美在线高清视频| 久久99久久久| 国产精品你懂的在线| 国产精品果冻传媒| 欧美bbbbb| 成人免费观看在线| 日韩精品2区| 国语精品中文字幕| 亚洲国产天堂| 欧美性视频在线| 中文在线手机av| 亚洲一区二区福利| 亚洲精品福利网站| 欧美日韩国产bt| 国产亚洲欧美在线精品| 亚洲黄色性网站| 一级黄色录像毛片| 成人av电影免费观看| 国内自拍第二页| 六月婷婷一区| 国产激情片在线观看| 日本久久精品| 久久精品中文字幕一区二区三区 | 正在播放欧美视频| 欧美熟妇另类久久久久久不卡| 欧美日韩国产综合一区二区三区| 午夜精品三级久久久有码| 亚洲精品日韩专区silk| 午夜黄色福利视频| 久久影音资源网| 国产人成视频在线观看| 国产一区二区三区免费播放| 免费激情视频在线观看| 9国产精品视频| 亚洲爆乳无码精品aaa片蜜桃| 第一sis亚洲原创| 蜜桃传媒一区二区| 青青草这里只有精品| 成人高清在线观看| 国产欧美视频在线| 国产色视频一区| 欧美不卡高清一区二区三区| 秋霞av国产精品一区| 毛片电影在线| 97成人超碰免| 国产精选在线| 欧美精品成人在线| 美女日批视频在线观看| 美女av一区二区三区| 黄色网页在线观看| 日韩在线视频观看| 巨大荫蒂视频欧美大片| 色老头一区二区三区在线观看| 国产粉嫩一区二区三区在线观看| 亚洲男女性事视频| 蜜桃视频在线入口www| 日韩国产一区三区| 色在线免费视频| 亚洲精品一区二区久| 深夜福利在线视频| 精品99999| 亚洲色偷精品一区二区三区| 日韩国产精品一区| 撸视在线观看免费视频| 亚洲色图35p| 春暖花开成人亚洲区| 视频直播国产精品| 国产在线看片| 欧美精品videofree1080p| 国产精品69xx| 奇米4444一区二区三区 | 精品国产丝袜高跟鞋| 久久久国产一区二区三区| 二区在线播放| 久久久久亚洲精品| 成人性生活视频| 国产精品网红直播| 国产精品日韩精品在线播放| 成人h视频在线观看| 色爱av综合网| 日韩欧美一区二区在线观看| 欧美aaaa视频| 777av视频| 久久精品中文| 99国产精品久久久久久| 国产a区久久久| www.久久av| 最新成人av在线| 日本熟妇一区二区| 在线国产亚洲欧美| 国产aⅴ一区二区三区| 亚洲国产精品网站| youjizz在线播放| 欧美福利小视频| 亚洲高清黄色| 69堂成人精品视频免费| 亚洲综合福利| 精品久久免费观看| 一区二区高清| 91欧美一区二区三区| 99精品国产91久久久久久| 波多野结衣一二三四区| 亚洲精品国产无天堂网2021| 在线精品免费视| 欧美一区2区视频在线观看| 四虎影院在线域名免费观看| 久久国内精品一国内精品| 国产盗摄——sm在线视频| 国产欧美久久一区二区| 农村少妇一区二区三区四区五区| 亚洲一二三区精品| 一本久道久久综合狠狠爱| 午夜大片在线观看| 久久久久国产精品厨房| 欧美国产日韩在线观看成人| 色吊一区二区三区| 亚洲女人18毛片水真多| 中文字幕亚洲欧美一区二区三区 | 黄色短视频在线观看| 亚洲视频综合在线| 色老头一区二区| 亚洲高清在线观看| 中文在线字幕免费观看| 国产日韩欧美在线看| 视频福利一区| 超碰成人免费在线| 国产另类ts人妖一区二区| 91导航在线观看| 色婷婷综合久久久久中文一区二区 | 久久国产精品免费| 精品少妇一区二区三区免费观| 亚洲一级二级在线| h片在线免费看| 日韩中文综合网| 韩国成人在线| 欧美日韩日本网| 中文在线不卡| 在线观看免费视频国产| 亚洲视频在线观看三级| 在线观看亚洲国产| 国产亚洲美女精品久久久| 国产一二三在线| 国产久一道中文一区| 欧美日韩爆操| avtt中文字幕| 一片黄亚洲嫩模| av中文字幕免费| 久久精品视频va| 91精品福利观看| 永久久久久久| 精品影视av免费| 亚洲一级二级片| 欧美巨大另类极品videosbest| 中国日本在线视频中文字幕| 国产精品成人免费电影| 精品九九在线| 在线免费观看视频黄| 欧美国产日韩亚洲一区| 这里只有精品国产| 最新国产精品拍自在线播放| 中文字幕日本一区| 欧美日韩视频免费在线观看| 国产一区二区网址| 国产盗摄一区二区三区在线| 日韩欧美一区在线| 超碰在线97国产| 国产一区二区黄色| 亚洲欧美大片| 中文字幕被公侵犯的漂亮人妻| 在线免费视频一区二区| 在线视频婷婷| 亚洲综合精品一区二区| 激情六月综合| 熟女少妇一区二区三区| 欧美午夜精品一区二区三区| 无遮挡的视频在线观看| 99久久久精品免费观看国产| 日韩一级欧洲| 99久久精品免费视频| 在线不卡a资源高清| 欧美日韩经典丝袜| 久久久久久久免费| 免费久久精品视频| 欧美日韩国产精品综合| 亚洲国产天堂久久综合网| 日韩免费福利视频| 男女啪啪的视频| 91网站在线观看视频| 中文字幕乱码在线观看| 欧美国产日韩二区| 亚洲黄页在线观看| 国产美女视频免费看| 亚洲成人免费视| 成人午夜电影在线观看| 亚洲永久免费观看| 免费在线亚洲欧美| 手机在线免费看毛片| 精品五月天久久| 国产精品视频一区视频二区| 霍思燕三级露全乳照| 国产精品久久久久久一区二区三区| 午夜精品久久久久久久96蜜桃| 日本成人黄色片| 在线成人直播| 少妇人妻好深好紧精品无码| 日韩欧美黄色影院| 亚洲成人av观看| 国产乱淫av片杨贵妃| 国产精品青草综合久久久久99| 亚洲精品一区二区三区蜜桃| 国产日韩一区在线| 国产一区91|