為什麼說 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 會如此成功?

  1. 可聲明性:你只要聲明好要輸出什麼,查詢引擎會為你找到最優化的方式來執行查詢。Pat Seliner 等人在 1979 年發明的基於成本的優化器一直在持續地提升 SQL 的查詢速度。這也提高了其他新進者的准入門檻。最近的一篇Apache Hive 論文解釋了優化器的複雜性。
  2. SQL 不只是被用在“查詢”方面,它也被用來更新數據,而存儲過程、UDF(用戶自定義函數)通過結合過程語言和聲明性的 SQL 擴展了 SQL 的能力。
  3. 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 兼容。
  4. SQL 為我們帶來了新的想法,擴展了新的數據類型、訪問方式和應用場景。
  5. SQL 本身與數據表示是分離的,可以被用在非關係型數據上,比如 CSV、JSON 以及其他所有的大數據格式。有些人認為關係型模型表示非常死板,所以認為 SQL 也是死板的。但事實上,對於給定的 schema,SQL 可以實現任意數據格式的 SELECT、連接、分組、聚合。

SQL 的支持情況

既然 SQL 現在已經無處不在,我們就有必要對 SQL 的支持情況進行一番瞭解。

  1. 瞭解每種工作負載的特點和目標。例如,是交互式的應用程序還是交互式分析?抑或是批次分析或 BI?
  2. SQL 所支持的語句反應了運維能力。
  3. 在表達式(標量、聚合、布爾值)、連接(內連接、左 / 右 / 全連接)、子查詢、視圖、排序、分頁(LIMIT/OFFSET)方面的能力。
  4. 索引:沒有索引的 SQL 只是一個圖靈機原型。
  5. 優化器:查詢重寫、選擇正確的訪問路徑、創建最優的查詢執行路徑讓 SQL 成為最成功的第四代語言。有一些帶有基於規則的優化器,有一些則帶有基於成本的優化器,有一些二者兼而有之。優化器是非常重要的一個因素,一般的測試基準(如 TPC-C、TPC-DS、YCSB、YCSB-JSON)在這方面幫不上什麼忙。
  6. 有句話是這麼說的:“性能、性能和性能是數據庫最重要的三件東西”。對工作負載進行性能方面的測試是非常關鍵的,YCSB 和它的擴展 YCSB-JSON 可以在這方面幫上忙。
  7. SDK:豐富的 SDK 和語言支持可以加快開發速度。
  8. BI 工具支持:對於大型的數據分析來說,BI 工具的支持是非常重要的。

N1QL 作者 Gerald Sangudi 曾經表示,SQL 是非常成功的,因為它代表了數據處理的基本操作。SQL 支持一組豐富的操作,SELECT、連接、嵌套、分組、聚合、HAVING、WINDOW、排序、分頁,等等。在談到數據操作時,這些就是我們要考慮的所有東西嗎?這個問題還有待觀察,不過我們可以肯定的是,其他語言(比如 Python 和 Java)正在為這些數據操作添加運算符。或許其他的語言也會跟風。SQL 已經走到了關係型模型沒能走到的地方。


分享到:


相關文章: