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