為什麼說 SQL 是最成功的第四代語言?
45 年前,兩名年輕的 IBM 研究員將一門關係型語言帶到了資料庫領域,旨在使用宣告性的方式來操作資料。從 Don Chamberlin 和 Ramond Boyce 發表“ SEQUEL:一門結構化的英語查詢語言 ”以來,關係型模型和 SQL 已經得到了廣泛擴充套件,並被用在大量的技術中,如 OLTP、OLAP、物件資料庫、物件關係型資料庫,甚至是 NoSQL 資料庫。SQL 也為非關係型資料庫帶去了設計靈感,比如用於物件資料庫的 SQL、用於物件關係的 SQL、用於 XML 的 SQL、用於空間資料的 SQL、用於搜尋的 SQL、用於 JSON 的 SQL、用於時序資料的 SQL、用於流的 SQL,等等。各種與資料打交道的 BI 工具也使用了 SQL。事實上,SQL 是最成功的第四代語言。
SQL 之所以神祕,是因為它的強大。
SQL 以關係代數為基礎,目標是提供一種接近英語的查詢語言:
- 具有宣告性;
- 可以通過組合的方式寫出複雜的查詢;
- 可以利用由 Edger F Codd 開發的關係型模型。
大資料試圖在資料倉庫領域補足或替換關係型系統,但它們仍然使用了 SQL。Hive、Impala、drill、BigSQL 都使用了基於 SQL 的語言、優化器,並使用了與 SQL 相似的大規模並行處理。它們還時不時地增加新的 SQL 特性。SQL 中的資料儲存格式、資料模型和查詢處理的分離帶來了一些非常重要的好處。在 SQL 誕生以來的 45 年當中,很多資料庫來了又去。NoSQL 運動浪潮甚至在無意中暗示了 SQL 和 SQL 資料庫即將死掉。但 SQL 陣營很坦然地面對這個問題,Don Chamberlin 最近表示:“當一門語言被廣泛認可,以至於其他語言開始標榜自己不同於這一門語言時,說明這門語言一定表現得很好”。
另一個數據庫陣營是 NoSQL。雖然現在對 NoSQL 的定義是“Not Only SQL”,但其實 NoSQL 在最開始想要遠離 SQL,並嘗試使用其他語言和框架,比如 map-reduce。但在十年之後,幾乎每一個流行的 NoSQL 資料庫都有了 SQL 變種:Couchbase 的 N1QL、Cassandra 的 CQL 和 Elasticsearch 的 ElasticSearch SQL。你可能會說:“MongoDB 並沒有 SQL”。但我敢肯定地說:“它將會有一個非常簡單的 SQL 實現”。
關係型模型已經非常成功了,不過資料庫還支援其他各種資料模型:JSON、圖、XML、時序、空間、長列、列式、文件,等等。這些資料庫當中大部分都有自己的 SQL 實現版本,即使是 NoSQL 資料庫也實現了 SQL 或者受 SQL 啟發的查詢語言。即使是在最性感的“資料科學”領域,SQL 仍然是一項非常被看重的技能。
現在,NoSQL 資料庫中的 SQL 專案比 SQL 資料庫中的 SQL 專案還要多。
為什麼 SQL 會如此成功?
- 可宣告性:你只要宣告好要輸出什麼,查詢引擎會為你找到最優化的方式來執行查詢。Pat Seliner 等人在 1979 年發明的基於成本的優化器一直在持續地提升 SQL 的查詢速度。這也提高了其他新進者的准入門檻。最近的一篇 Apache Hive 論文 解釋了優化器的複雜性。
- SQL 不只是被用在“查詢”方面,它也被用來更新資料,而儲存過程、UDF(使用者自定義函式)通過結合過程語言和宣告性的 SQL 擴充套件了 SQL 的能力。
- SQL 具有非常好的可延展性。SQL 標準經過多次擴充套件,每次都加入了很多新特性、新語法和新的關鍵字。可以肯定的是,並不是所有 SQL 標準都是一樣的。即使是 RDBMS 的傳統 SQL 實現也不會完全相容,除非在寫 SQL 時非常小心地考慮相容性問題。除了這些之外,SQL 的精髓都是一樣的。SQL++ 是 SQL 進化的一個很好的例子。Don Chamberlin 和 Mike Carey 就 SQL 是否需要支援複雜的資料模型進行過討論,以便讓使用者和開發人員可以方便地訪問 JSON 格式的資料。Don 撰寫的“ SQL++ For SQL User: A Tutorial ”一書介紹了 SQL++ 的發展情況,SQL++ 是一門被設計用來處理 JSON 資料模型的語言,同時與 SQL 相容。
- SQL 為我們帶來了新的想法,擴充套件了新的資料型別、訪問方式和應用場景。
- SQL 本身與資料表示是分離的,可以被用在非關係型資料上,比如 CSV、JSON 以及其他所有的大資料格式。有些人認為關係型模型表示非常死板,所以認為 SQL 也是死板的。但事實上,對於給定的 schema,SQL 可以實現任意資料格式的 SELECT、連線、分組、聚合。
SQL 的支援情況
既然 SQL 現在已經無處不在,我們就有必要對 SQL 的支援情況進行一番瞭解。
- 瞭解每種工作負載的特點和目標。例如,是互動式的應用程式還是互動式分析?抑或是批次分析或 BI?
- SQL 所支援的語句反應了運維能力。
- 在表示式(標量、聚合、布林值)、連線(內連線、左 / 右 / 全連線)、子查詢、檢視、排序、分頁(LIMIT/OFFSET)方面的能力。
- 索引:沒有索引的 SQL 只是一個圖靈機原型。
- 優化器:查詢重寫、選擇正確的訪問路徑、建立最優的查詢執行路徑讓 SQL 成為最成功的第四代語言。有一些帶有基於規則的優化器,有一些則帶有基於成本的優化器,有一些二者兼而有之。優化器是非常重要的一個因素,一般的測試基準(如 TPC-C、TPC-DS、YCSB、YCSB-JSON)在這方面幫不上什麼忙。
- 有句話是這麼說的:“效能、效能和效能是資料庫最重要的三件東西”。對工作負載進行效能方面的測試是非常關鍵的,YCSB 和它的擴充套件 YCSB-JSON 可以在這方面幫上忙。
- SDK:豐富的 SDK 和語言支援可以加快開發速度。
- BI 工具支援:對於大型的資料分析來說,BI 工具的支援是非常重要的。
N1QL 作者 Gerald Sangudi 曾經表示,SQL 是非常成功的,因為它代表了資料處理的基本操作。SQL 支援一組豐富的操作,SELECT、連線、巢狀、分組、聚合、HAVING、WINDOW、排序、分頁,等等。在談到資料操作時,這些就是我們要考慮的所有東西嗎?這個問題還有待觀察,不過我們可以肯定的是,其他語言(比如 Python 和 Java)正在為這些資料操作新增運算子。或許其他的語言也會跟風。SQL 已經走到了關係型模型沒能走到的地方。
原文連結: https://blog.couchbase.com/unreasonable-effectiveness-of-sql/