為什麼說 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 已經走到了關係型模型沒能走到的地方。