告別刻板印象:SQL是你應(yīng)該掌握的技能!
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。
據(jù)2020年JetBrains開(kāi)發(fā)者生態(tài)系統(tǒng)調(diào)查顯示,有56%的開(kāi)發(fā)者在開(kāi)發(fā)中使用SQL數(shù)據(jù)庫(kù)或與SQL數(shù)據(jù)庫(kù)進(jìn)行交互。但即便如此,大多數(shù)開(kāi)發(fā)人員仍將SQL概念視為第二選擇,他們通常通過(guò)自己選擇的語(yǔ)言進(jìn)行交互,而且在設(shè)計(jì)中作用不大。總而言之,能夠連接并運(yùn)行基本查詢就足夠了。
許多公司甚至還有一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)團(tuán)隊(duì),負(fù)責(zé)數(shù)據(jù)庫(kù)的設(shè)計(jì)和優(yōu)化。筆者認(rèn)為這是限制人們更深入地學(xué)習(xí)SQL的原因:很多人是這樣想的,SQL是別人使用的工具。軟件開(kāi)發(fā)人員的工具夠多了。
但這個(gè)行業(yè)技多不壓身,你永遠(yuǎn)不知道接下來(lái)遇到什么狀況。我們每天都與SQL進(jìn)行交互,因此,儲(chǔ)備更多的知識(shí)有備無(wú)患。此外,如果所在的公司規(guī)模小、沒(méi)有足夠的數(shù)據(jù)庫(kù)團(tuán)隊(duì)資源,那么你的責(zé)任將更大。在面試中展現(xiàn)出你對(duì)數(shù)據(jù)庫(kù)使用技巧很自信,會(huì)帶你通往許多有趣的職業(yè)方向。
相比較其他領(lǐng)域而言筆者更喜歡SQL開(kāi)發(fā)。我早期的實(shí)習(xí)就是與一群杰出的數(shù)據(jù)庫(kù)管理員共事,從此愛(ài)上SQL。筆者在學(xué)校上過(guò)數(shù)據(jù)庫(kù)課程,因此有一些基本知識(shí),但在實(shí)習(xí)期間學(xué)到的東西是無(wú)價(jià)的,不僅讓我意識(shí)到自己對(duì)數(shù)據(jù)的熱情,期間收獲的技術(shù)理解也為之后的每項(xiàng)工作大大增色。
數(shù)據(jù)庫(kù)開(kāi)發(fā)和管理內(nèi)容很多,相關(guān)專家也是妙筆生花,這些可以幫助開(kāi)發(fā)人員(不會(huì)靈活運(yùn)用SQL)在涉及到SQL知識(shí)時(shí)脫穎而出。根據(jù)筆者經(jīng)驗(yàn),本文中的概念引用自Microsoft SQL Server,這些概念也適用于其他SQL數(shù)據(jù)庫(kù)管理系統(tǒng)。
規(guī)范化
如果你在學(xué)校選修過(guò)關(guān)系數(shù)據(jù)庫(kù)的課程,那你肯定見(jiàn)過(guò)“規(guī)范化”一詞。這是數(shù)據(jù)庫(kù)設(shè)計(jì)的核心概念。但更關(guān)鍵的是,它能使開(kāi)發(fā)人員的生活更輕松。
數(shù)據(jù)庫(kù)規(guī)范化的主要思想是減少數(shù)據(jù)冗余并確保數(shù)據(jù)存儲(chǔ)整潔、有邏輯。數(shù)據(jù)庫(kù)規(guī)范化的級(jí)別取決于數(shù)據(jù)庫(kù)的“規(guī)范形式”。迄今有最多六種規(guī)范形式(有爭(zhēng)議),但實(shí)際需要了解的只是前三種。簡(jiǎn)單來(lái)說(shuō),以下是主要規(guī)則:
第一范式(1NF)指出單個(gè)字段應(yīng)存儲(chǔ)單個(gè)數(shù)據(jù)點(diǎn),并且所有行均應(yīng)唯一。不要在字段中存儲(chǔ)事物列表,這些屬于個(gè)人記錄。
第二范式(2NF)指出每個(gè)表應(yīng)具有單個(gè)主鍵列。創(chuàng)建唯一的ID。不必使用名稱和地址作為復(fù)合鍵,只需給用戶提供唯一的ID號(hào)或GUID。
第三范式(3NF)指出不允許功能傳遞依賴項(xiàng)。這條可能是最復(fù)雜的一項(xiàng),從本質(zhì)上意味著如果有一個(gè)依賴于另一個(gè)字段的字段,則應(yīng)將該字段分解到另一個(gè)表中。這允許外鍵更改-不能更改實(shí)際值。
這里的重點(diǎn)是數(shù)據(jù)應(yīng)該是最小單位,因此具有重復(fù)數(shù)據(jù)的大表將拆分為具有易于搜索的鍵的較小表,從而使過(guò)濾更有效、查詢更直接,你的工作也會(huì)更加輕松!
數(shù)據(jù)庫(kù)對(duì)象
圖源:unsplash
如果你身兼數(shù)職,或者公司沒(méi)有數(shù)據(jù)庫(kù)團(tuán)隊(duì),那么你可能會(huì)負(fù)責(zé)數(shù)據(jù)庫(kù)開(kāi)發(fā)。這種情況下,你應(yīng)該不同情況下使用哪種類型的數(shù)據(jù)庫(kù)對(duì)象有很好的了解。簡(jiǎn)言之,數(shù)據(jù)庫(kù)對(duì)象是可以使用創(chuàng)建腳本存儲(chǔ)或訪問(wèn)數(shù)據(jù)的任何內(nèi)容,最常見(jiàn)的例子就是表格,它是數(shù)據(jù)庫(kù)的組成部分。這些顯然是數(shù)據(jù)存儲(chǔ)的必經(jīng)之路。
但是,還有其他類型的對(duì)象以不同的方式訪問(wèn)和轉(zhuǎn)換數(shù)據(jù)。使用最好的對(duì)象進(jìn)行工作很重要。下面是使用案例中應(yīng)用對(duì)象的基本規(guī)則(索引本質(zhì)上是數(shù)據(jù)庫(kù)對(duì)象,因?yàn)樗鼈儠?huì)影響數(shù)據(jù)的存儲(chǔ)和訪問(wèn)方式):
存儲(chǔ)過(guò)程:這是處理或轉(zhuǎn)換數(shù)據(jù)的必經(jīng)之路。如果需要在一天中的特定時(shí)間或以特定的節(jié)奏進(jìn)行更新,則可以創(chuàng)建存儲(chǔ)過(guò)程,然后按程序運(yùn)行。 ·
視圖:視圖本質(zhì)上是一個(gè)存儲(chǔ)的查詢,可以從動(dòng)態(tài)數(shù)據(jù)集中進(jìn)行選擇。如果數(shù)據(jù)需要刷新或可能轉(zhuǎn)換,筆者常用視圖替換緩存的表。實(shí)際上并沒(méi)有存儲(chǔ)任何更改,但可以加入計(jì)算所得的字段,當(dāng)你需要?jiǎng)討B(tài)的最新數(shù)據(jù)時(shí),視圖就是一個(gè)不錯(cuò)的選擇。
了解了表、視圖和存儲(chǔ)過(guò)程之后,你將能夠處理大多數(shù)數(shù)據(jù)庫(kù)開(kāi)發(fā)任務(wù)。
圖源:unsplash
索引
首先需要了解的索引概念是聚集索引和非聚集索引之間的區(qū)別。
聚集索引:根據(jù)索引將所有數(shù)據(jù)存儲(chǔ)在表中。只能有一個(gè)聚集索引,默認(rèn)情況下,主鍵為聚集。
非聚集索引:將索引字段與表分開(kāi)存儲(chǔ)。該索引字段指向表中存儲(chǔ)的數(shù)據(jù),就像書(shū)的索引一樣。
要提高查詢效率,就要增加存儲(chǔ)量。非聚集索引需要自己存儲(chǔ),因?yàn)樗鼈兣c表數(shù)據(jù)保持獨(dú)立。僅索引需要過(guò)濾或加入的字段,以便在存儲(chǔ)和性能之間找到最佳平衡。
索引編制是優(yōu)化數(shù)據(jù)庫(kù)性能的最佳方法。索引會(huì)影響數(shù)據(jù)在頁(yè)面中的存儲(chǔ)方式。默認(rèn)情況下,記錄不會(huì)以特定的順序存儲(chǔ),因此本質(zhì)上對(duì)字段建立索引就能使數(shù)據(jù)以可預(yù)測(cè)的方式存儲(chǔ)。在該字段上進(jìn)行篩選時(shí),查詢將運(yùn)行得更快,因?yàn)镾QL Server知道從那個(gè)確切的位置開(kāi)始查找。
可以為特定目的在字段上設(shè)置許多索引,但是如果要提高性能,我們通常會(huì)創(chuàng)建通用的非聚集索引。此外,如果要?jiǎng)?chuàng)建索引,就必須進(jìn)行維護(hù),插入、更新和刪除會(huì)造成索引碎片。
因此,除非數(shù)據(jù)沒(méi)有更新,否則就需要根據(jù)數(shù)據(jù)更改的頻率來(lái)重建索引。理想情況下應(yīng)該使用計(jì)劃的存儲(chǔ)過(guò)程來(lái)執(zhí)行此操作,以便始終保持運(yùn)行穩(wěn)定。
創(chuàng)建索引的SQL語(yǔ)句非常簡(jiǎn)單。下面的語(yǔ)句將在Orders表的給定字段上創(chuàng)建一個(gè)名為 idx_orderdate的非聚集索引:
- CREATE INDEX idx_orderdate ON Orders (OrderDate);
讀取查詢計(jì)劃
如果想更深入地了解數(shù)據(jù)庫(kù)性能,讀取查詢計(jì)劃非常有用。運(yùn)行查詢時(shí),SQL Server會(huì)根據(jù)執(zhí)行計(jì)劃對(duì)其進(jìn)行處理。你可以在運(yùn)行查詢時(shí)生成計(jì)劃,或者如果查詢已在運(yùn)行,則查看緩存的計(jì)劃,可以查看在查詢的每個(gè)步驟上花費(fèi)了多長(zhǎng)時(shí)間。
有經(jīng)驗(yàn)的SQL向?qū)Э梢詮牟樵冇?jì)劃中讀取很多細(xì)微差別。但是,專業(yè)的開(kāi)發(fā)人員需要知道的是搜索和掃描之間的區(qū)別。
- 掃描:可以是索引掃描或表掃描,但是無(wú)論哪種方式,SQL Server都必須掃描整個(gè)表或索引以查找數(shù)據(jù)。
- 搜索:對(duì)于索引搜索,SQL Server能夠基于給定的索引來(lái)識(shí)別要查詢的數(shù)據(jù)。
搜尋通常更有效。如果要優(yōu)化查詢,則應(yīng)確定查詢中掃描的位置并進(jìn)行修復(fù)。解決它們的最簡(jiǎn)單方法是確保加入了索引字段。
如果缺少查詢中可能使用的索引,SQL Server會(huì)發(fā)出通知。該建議將出現(xiàn)在查詢計(jì)劃的頂部。如果右鍵單擊建議索引的查詢計(jì)劃,然后選擇“缺少索引詳細(xì)信息”,甚至可以生成索引創(chuàng)建腳本。
圖源:unsplash
恭喜,你已經(jīng)提高了SQL技能!現(xiàn)在可以使用這些概念優(yōu)化數(shù)據(jù)庫(kù)并更有效地進(jìn)行查詢。無(wú)論是從應(yīng)用程序中查詢還是構(gòu)建自己的存儲(chǔ)過(guò)程和視圖,這些技巧都會(huì)使工作更加輕松!