天天看點

為什麼說 SQL 是最成功的第四代語言?為什麼 SQL 會如此成功?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 已經走到了關系型模型沒能走到的地方。

為什麼說 SQL 是最成功的第四代語言?為什麼 SQL 會如此成功?SQL 的支援情況

擷取以上Java進階架構最新視訊,歡迎

加入Java進階架構交流群:734066324。直接點選連結加入群聊【Java進階架構師】:https://jq.qq.com/?_wv=1027&k=5Fbnv8G