精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美成人合集magnet| 欧美一区=区三区| 校园春色另类视频| 亚洲欧洲国产日韩| 国产精品wwwwww| 亚洲天堂资源在线| 91欧美日韩麻豆精品| 免费成人高清在线视频theav| 有码一区二区三区| 91免费在线视频网站| 18啪啪污污免费网站| 欧美极品免费| 久久久精品tv| 国产v综合v亚洲欧美久久| 国产精品无码在线| **欧美日韩在线| 亚洲日韩欧美一区二区在线| 91精品国产综合久久香蕉最新版 | 日韩精品免费在线| 成人免费性视频| 亚洲高清在线看| 亚洲深夜福利在线观看| 岛国av一区二区三区| 久久riav二区三区| 欧美啪啪小视频| 综合国产视频| 亚洲成色777777女色窝| 黄色影院一级片| 青青九九免费视频在线| 国产精品sss在线观看av| 亚洲小说欧美激情另类| 国产精品区一区二区三含羞草| 免费一级全黄少妇性色生活片| 一区二区三区在线免费看| 亚洲午夜国产一区99re久久| 亚洲高清视频一区二区| 91丨九色丨蝌蚪丨对白| 视频一区欧美精品| 日韩一区av在线| 日本少妇xxx| 日本在线影院| 国产精品久久毛片a| 91精品综合久久| 亚洲日本韩国在线| 日韩欧美一区二区三区免费看| 91麻豆精品国产91久久久资源速度 | 97久久精品在线| 中文字字幕码一二三区| 懂色aⅴ精品一区二区三区| ㊣最新国产の精品bt伙计久久| 欧美精品一区三区在线观看| 在线免费av网| 亚洲成人资源| 中文字幕日本欧美| 成人免费看片载| 超碰91在线观看| 久久免费午夜影院| 91亚洲午夜在线| hs视频在线观看| 日韩高清一级片| 日韩在线视频观看| 给我免费观看片在线电影的| 成人高潮a毛片免费观看网站| 黑人巨大精品欧美一区二区| 少妇人妻无码专区视频| 在线观看麻豆| 99riav一区二区三区| 国产精品视频白浆免费视频| 精品亚洲永久免费| 久久精品国产www456c0m| 亚洲成人xxx| 精品人妻少妇嫩草av无码| 亚洲另类春色校园小说| 中文在线资源观看视频网站免费不卡 | 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美深夜福利| 一个人看的www久久| 2018国产精品| 四虎国产精品永久在线国在线| 欧美亚日韩国产aⅴ精品中极品| 久久亚洲a v| 波多野结衣在线网站| 不卡一卡二卡三乱码免费网站 | **日韩最新| 精品国产凹凸成av人网站| 免费涩涩18网站入口| jizzjizz中国精品麻豆| 亚洲视频免费看| 免费拍拍拍网站| 黑人巨大精品| 天天色 色综合| 超碰成人免费在线| 一二区成人影院电影网| 色一情一乱一乱一91av| 国产3p露脸普通话对白| 最新日韩一区| 色欲综合视频天天天| 天天做天天干天天操| 97成人超碰| 欧美tickling挠脚心丨vk| 6080国产精品| 精品国产鲁一鲁****| 欧美精品亚洲二区| 中文字幕第36页| av成人免费| 精品免费99久久| 人妻av无码一区二区三区| 亚洲人成伊人成综合图片| 久久精品久久久久| 欧美激情图片小说| 亚洲一区 二区 三区| 日韩视频免费中文字幕| 亚洲 欧美 视频| 一本综合精品| 欧美一级黑人aaaaaaa做受| 日韩三级一区二区三区| 久久精品国产色蜜蜜麻豆| 91免费版网站入口| 免费一级毛片在线观看| 国产日韩欧美高清| 四虎影院一区二区三区| 香蕉视频免费在线播放| 亚洲欧美日韩电影| 亚洲理论电影在线观看| 日本久久久久| 国产一区二区三区在线免费观看| 精品视频在线观看免费| 国产在线播放一区| 国产高清精品一区| 日本免费一区二区三区最新| 亚洲精品免费看| www.se五月| 91精品啪在线观看国产手机| 日韩在线观看免费全集电视剧网站| 国产91精品一区| jizz一区二区| 亚洲日本一区二区三区在线不卡| 毛片在线看网站| 亚洲资源中文字幕| 夫妻免费无码v看片| 日韩08精品| 亚洲免费一在线| 免费看一级黄色| 欧美黄免费看| 欧美在线视频一区二区| 国产黄色免费视频| 91视频观看视频| 中日韩在线视频| zzzwww在线看片免费| 日韩精品一区二区三区中文不卡| 中文字幕影片免费在线观看| 国产精品99一区二区| 99se婷婷在线视频观看| 精品无吗乱吗av国产爱色| 亚洲欧美成人一区二区三区| 国内外成人免费在线视频| 国产精品男女| 国内精品400部情侣激情| 中文字幕日产av| 波多野结衣中文字幕一区| 免费看毛片的网址| 精品伊人久久久| 久久精品国产亚洲精品2020| 国产精品久久综合青草亚洲AV| 成人av在线一区二区| 无码中文字幕色专区| 一呦二呦三呦国产精品| 国产精品久久久久久久久久ktv| av在线电影观看| 7777精品久久久大香线蕉| 99热精品免费| 免费欧美日韩国产三级电影| 国产美女精品在线观看| 日本午夜在线视频| 色哦色哦哦色天天综合| 久久久久无码国产精品一区李宗瑞 | 国产麻豆日韩欧美久久| 欧美日韩成人一区二区三区| 美女视频在线免费| 色老头一区二区三区| 国产jzjzjz丝袜老师水多 | 欧美亚洲精品一区二区| 精品国产乱码久久久久久樱花| 欧美床上激情在线观看| 四虎精品在线| 亚洲最新视频在线观看| 中文字幕一区二区久久人妻网站 | 中文字幕第315页| 亚洲精品中文字幕在线观看| 日本护士做爰视频| 美女视频一区二区| 精品一二三四五区| 欧美日韩高清| 国产97在线观看| 久久久久久久影视| 91麻豆精品国产91久久久久| 日韩黄色在线视频| 懂色av一区二区三区免费看| 国产a级片免费看| 亚洲国产伊人| 777777777亚洲妇女| 三级网站免费观看| 亚洲mv在线观看| 一级黄色电影片| 蜜桃av一区二区三区| 国产v片免费观看| 中文字幕亚洲精品乱码| 日本一区二区三区www| 香蕉成人影院| 国内精品久久久久久| 乱人伦中文视频在线| 精品视频久久久久久久| 国产免费观看av| 亚洲欧美视频在线观看| xxxx日本黄色| 久久成人久久爱| 欧美日韩视频免费在线观看| 亚洲三级精品| 国产精品有限公司| 日本成人精品| 国产专区欧美专区| 最新日韩一区| 国产精品第1页| 超碰超碰人人人人精品| 久久久久在线观看| 亚洲大胆人体大胆做受1| 精品久久久久久最新网址| 在线亚洲欧美日韩| 色一区在线观看| 久久久精品视频网站| 中文字幕国产一区二区| www.污网站| 蜜臀91精品一区二区三区| 男人舔女人下面高潮视频| 欧美色女视频| 不卡一区二区三区四区五区| 57pao成人永久免费| 国产欧美一区二区三区久久人妖| 性感美女一区二区在线观看| 日本欧美国产在线| 欧美日韩免费看片| 欧洲美女免费图片一区| 澳门成人av网| 国产精品久久久久久久一区探花| 性欧美1819sex性高清| 国产成人精品日本亚洲| 性高爱久久久久久久久| 国产精品久久久| 成人在线中文| 91在线视频精品| 亚洲精选av| 国产富婆一区二区三区| 日韩欧美美女在线观看| 欧美人xxxxx| 国产精品视频一区二区三区四蜜臂| 91精品在线国产| 国产精品777777在线播放| 欧美诱惑福利视频| 在线免费三级电影网站| 久久久极品av| 欧美大片黄色| 色偷偷av亚洲男人的天堂| 免费黄网站在线| 九九九久久国产免费| 国内av一区二区三区| 在线观看国产成人av片| 免费黄色在线观看| 欧美激情一区二区三区在线视频观看| 国产精品天堂| 日韩高清人体午夜| 蝌蚪视频在线播放| 色偷偷噜噜噜亚洲男人| 欧美卡一卡二| 日本不卡免费高清视频| 欧美videos粗暴| 青青a在线精品免费观看| 欧美精品高清| 99在线国产| 精品精品久久| 国产a级黄色大片| 99久久精品费精品国产风间由美| 久久久精品动漫| 清纯唯美综合亚洲| 天堂8在线天堂资源bt| 久久成人一区| 玩弄中年熟妇正在播放| 蜜臀久久久久久久| 国产综合内射日韩久| 久久久不卡影院| 国产探花在线免费观看| 色综合 综合色| www久久久com| 日韩欧美国产一区二区在线播放| 五月激情婷婷网| 亚洲国产精品悠悠久久琪琪| 午夜精品久久久久久久爽 | 亚洲人成在线影院| 日b视频免费观看| 日韩中文字幕亚洲一区二区va在线 | 亚洲欧洲日韩国产| 亚洲色偷精品一区二区三区| 自拍视频国产精品| 老色鬼在线视频| 亚洲xxxxx| 日韩一区二区三区精品| 欧美性bbwbbwbbwhd| 国内自拍视频一区二区三区| 粉嫩av一区二区三区天美传媒| 亚洲成人三区| 欧美与动交zoz0z| 欧美体内she精视频在线观看| 国产1区2区在线| 日韩av中文在线观看| 美女扒开腿免费视频| 国产精品伦理在线| 久久久精品视频网站| 亚洲成人1234| 直接在线观看的三级网址| 欧美高清在线视频观看不卡| 欧美性爽视频| 成人乱人伦精品视频在线观看| va天堂va亚洲va影视| 日韩高清国产精品| 久久麻豆精品| 日韩免费毛片视频| 99视频精品在线| 日本熟妇毛茸茸丰满| 日韩视频一区在线观看| 人妻视频一区二区三区| 日韩黄在线观看| 人妖欧美1区| 91手机在线播放| 一本精品一区二区三区| 日本美女视频一区| 国产精品国产a| 国产精品成人国产乱| 色综合欧美在线视频区| 天天射天天色天天干| 欧美黑人巨大精品一区二区| 麻豆久久一区| 996这里只有精品| 国产成人av电影| 国产精品久久中文字幕| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 99久久综合精品| 久久高清免费视频| 亚洲高清色综合| 绿色成人影院| 免费99视频| 小处雏高清一区二区三区| 不卡的在线视频| 亚洲精品中文字幕乱码三区| 亚洲成人中文字幕在线| 亚洲午夜国产成人av电影男同| 黄色网址免费在线观看| 777精品视频| 亚洲国产网址| www.99av.com| ●精品国产综合乱码久久久久| 6—12呦国产精品| 欧美另类老女人| 免费日韩一区二区三区| 亚洲第一综合网站| 国产精品自拍一区| 国产精品99精品| 国产亚洲精品成人av久久ww| 欧美jizz18| 97在线国产视频| 久久精品亚洲乱码伦伦中文| 中文字幕av久久爽| 欧美国产极速在线| 中国av一区| 中文av字幕在线观看| 亚洲图片欧美视频| 九色视频在线观看免费播放| 国产精品视频色| 欧美精品福利| 日本在线不卡一区二区| 色妞www精品视频| 欧美日韩经典丝袜| 欧美日韩免费精品| 国产精品亚洲人在线观看| www成人在线| 久久五月天综合| 日韩欧国产精品一区综合无码| 男人的天堂视频在线| 91美女蜜桃在线| 99精品在线看| 不卡av电影在线观看| 久久精品66| 日韩av片专区| 色综合久久综合中文综合网| 国产鲁鲁视频在线观看特色| 精品久久久久久综合日本| 亚洲网址在线| 呻吟揉丰满对白91乃国产区| 亚洲黄色www网站| 成人在线视频区| 成人性做爰aaa片免费看不忠| 久久嫩草精品久久久精品|