10倍提升你的SQL查詢速度
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
![]() 作為一名數(shù)據(jù)分析師,SQL是必備技能之一。其優(yōu)勢也比較明顯:易于理解,維護(hù)和擴(kuò)展。然而,最大的挑戰(zhàn)在于,隨著數(shù)據(jù)量的增加,我們就會遇到延遲的瓶頸,或者說查詢太昂貴(耗時)而無法運(yùn)行。 在這篇文章中我將會給出一些克服瓶頸的經(jīng)驗,這些 tips 也許會讓延遲減小10倍甚至100倍。So,讓我們一起深入了解吧。 1. 理解 SQL 的查詢順序SQL 就像一個迷你版的編程語言,它按順序處理數(shù)據(jù)。 ![]() 使用諸如“ 2. 用星型模式加快查詢速度在數(shù)據(jù)庫設(shè)計中,數(shù)據(jù)工程師喜歡對數(shù)據(jù)庫進(jìn)行規(guī)范化,減少數(shù)據(jù)表之間的冗余,從而優(yōu)化存儲、理清數(shù)據(jù)關(guān)系。然而,凡事皆有利弊,與之對應(yīng)的缺點(diǎn)是查詢時需要多個連接和子查詢來對數(shù)據(jù)進(jìn)行非規(guī)范化以提取所需的信息。 ![]()
為了加快查詢速度,建議首先對維度表進(jìn)行非規(guī)范化或聯(lián)接,因為維度表通常較小并且聯(lián)接速度更快。之后,如果可能的話,與大型事實(shí)表連接。在上述情況下,請嘗試在查詢的最后一步處理大型銷售表。根據(jù)前人的實(shí)踐經(jīng)驗,遵循這一理念通常可以將查詢速度提高 10 倍左右。 3. 通過了解關(guān)鍵索引將查詢速度提高 100 倍在下面的示例中,用戶可以按時間或按列遍歷/查詢數(shù)據(jù)。從視覺上看,按時間(逐行)或按列遍歷數(shù)據(jù),時間復(fù)雜度可能不會有太大差異。 ![]() 然而,實(shí)際上,數(shù)據(jù)并不是以連續(xù)的方式存儲的。它更像是一個鏈表數(shù)據(jù)結(jié)構(gòu)。通過時間查詢與通過列查詢之間存在巨大差異。 如下圖所示,通過在查詢中使用時間索引,您可以輕松地將遍歷時間或查詢時間縮短10倍。隨著列數(shù)量的增加,效率增益甚至更大。國外某小哥親述在其項目工作中,在處理大型表(數(shù) GB 數(shù)據(jù))時,他們將查詢時間從 41 天縮短到大約 40 分鐘,速度提高了約 100 倍。 ![]() 在這種情況下,基于時間塊運(yùn)行的查詢可能比按列運(yùn)行的查詢快 10 到 100 倍,因為數(shù)據(jù)庫是按時間索引的。 此外,您可以要求數(shù)據(jù)分析師或數(shù)據(jù)工程師根據(jù)您的業(yè)務(wù)需求重新索引您的數(shù)據(jù)庫。 -- two queries to pull large data datable 4. 利用 Python 的能力在現(xiàn)實(shí)項目中,完成上述步驟后,由于 SQL 的帶寬或數(shù)據(jù)庫服務(wù)器的計算能力瓶頸,你的 SQL 查詢?nèi)匀徊粔蚩臁?/p> 這個時候就可以使用 Python/Pandas 將中間表緩存到本地驅(qū)動器或云驅(qū)動器,之后用戶就可以使用 Python 執(zhí)行繁重的表連接或聚合步驟,這樣通常會比在數(shù)據(jù)庫中執(zhí)行類似的步驟快得多。 下面是一個代碼示例,通過 Jupyter Notebook 執(zhí)行 PostgreSQL 查詢并將查詢結(jié)果導(dǎo)出為 dataframe:
5. 總結(jié)在這篇文章中,我們總結(jié)了四種加快你 SQL 查詢速度的方式:
希望這篇文章對您有用,如果您有更好的技巧或建議,請與我們一同分享。 Thank you for your reading, happy querying! 該文章在 2023/11/16 20:36:36 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |