SQL Server 和 PostgreSQL 功能區(qū)別差異分析
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
介紹PostgreSQL 和 SQL Server 都是廣泛被使用的關(guān)系數(shù)據(jù)庫。盡管它們具有一些共同的核心特征,但它們之間也存在顯著的差異。本文詳細(xì)介紹了 PostgreSQL 和 SQL Server 之間的相似之處和不同之處。 最重要的一個(gè)區(qū)別是 PostgreSQL 是開源的,而 SQL Server 由 Microsoft 擁有和許可的。此外,您還將了解兩個(gè)系統(tǒng)在許可和成本、易用性、SQL 語法和合規(guī)性、數(shù)據(jù)類型、可用功能、性能和安全性方面的差異,以及相互比較中會涵蓋的其他幾十個(gè)主題。 對于考慮從商業(yè)數(shù)據(jù)庫切換到開源數(shù)據(jù)庫的組織,這會很有用處,但也需要有關(guān)這兩個(gè)系統(tǒng)可能的權(quán)衡和優(yōu)勢的更多信息。但是,它適用于任何想了解更多關(guān)于關(guān)系數(shù)據(jù)庫的人。 服務(wù)器許可模式PostgreSQL PostgreSQL 是根據(jù) PostgreSQL 許可證(開源促進(jìn)會批準(zhǔn)的許可證)發(fā)布的開源數(shù)據(jù)庫。將 PostgreSQL 用于任何目的(包括商業(yè)目的)都是免費(fèi)的。在 PostgreSQL 全球開發(fā)組下面,PostgreSQL 會永遠(yuǎn)以免費(fèi)和開源軟件的形式提供給用戶。 SQL Server Microsoft SQL Server 通過商業(yè)許可證提供,并且可以按 CPU 核數(shù)或者服務(wù)器和客戶端訪問級別(CAL)的模式進(jìn)行許可。SQL Server 提供兩個(gè)主要版本,企業(yè)版和標(biāo)準(zhǔn)版,以滿足組織和個(gè)體的性能和價(jià)格要求。許可成本從標(biāo)準(zhǔn)版的 3,586 美元到企業(yè)版(雙核)的 13,748 美元不等;服務(wù)器和 CAL 模式需為服務(wù)器運(yùn)行支付 899 美元,外加每位用戶 209 美元。學(xué)生和開發(fā)人員可以使用免費(fèi)版本進(jìn)行構(gòu)建和測試。 數(shù)據(jù)類型PostgreSQL 和 SQL Server 的數(shù)據(jù)類型對比表
地理數(shù)據(jù)PostgreSQL PostgreSQL 沒有用于地理數(shù)據(jù)的內(nèi)置數(shù)據(jù)類型。開源的 PostGIS 資源提供了對地理對象的支持。 SQL Server SQL Server 具有用于存儲地理空間數(shù)據(jù)的 geography 數(shù)據(jù)類型。 大小寫敏感性PostgreSQL PostgreSQL 在處理字符串時(shí)區(qū)分大小寫。LOWER() 函數(shù)允許用戶將字符串轉(zhuǎn)換為全部小寫以進(jìn)行計(jì)算(也有類似的 UPPER() 函數(shù))。默認(rèn)情況下,PostgreSQL 會將表和列的名稱轉(zhuǎn)換為小寫,除非您將這些名稱放在引號中。context 模塊提供了一個(gè)不區(qū)分大小寫的字符串?dāng)?shù)據(jù)類型 context,用于比較值。 SQL Server 默認(rèn)情況下,SQL Server 不區(qū)分大小寫。調(diào)整 SQL Server 的排序規(guī)則設(shè)置,可以更改大小寫的區(qū)分??稍跀?shù)據(jù)庫或列級別設(shè)置區(qū)分大小寫的排序規(guī)則設(shè)置。 索引類型PostgreSQL PostgreSQL 為索引類型提供了多個(gè)選擇,包括 B 樹、哈希、通用搜索樹(GiST)、空間分區(qū)的 GiST、通用倒排索引(GIN)和塊范圍索引(BRIN)。此外,它還支持表達(dá)式索引(使用表達(dá)式或函數(shù)而不是列值創(chuàng)建的索引)和部分索引(表的一部分的索引)。 SQL Server SQL Server 提供了聚集索引和非聚集索引。聚集索引根據(jù)基本值(索引定義中的列)對表或視圖中的數(shù)據(jù)行進(jìn)行排序和存儲。一個(gè)表只能有一個(gè)聚集索引。非聚集索引與表數(shù)據(jù)分開存儲,并且每個(gè)鍵值條目都有一個(gè)指向數(shù)據(jù)的指針。當(dāng)您在表列上定義 PRIMARY KEY 和 UNIQUE 約束時(shí),SQL Server 會自動創(chuàng)建這些索引。UNIQUE 約束創(chuàng)建非聚集索引,而 PRIMARY KEY 會創(chuàng)建聚集索引,除非已存在聚集索引。 復(fù)制PostgreSQL PostgreSQL 支持主從復(fù)制。復(fù)制可以是同步的,也可以是異步的。異步復(fù)制使用預(yù)寫式日志(WAL)向副本節(jié)點(diǎn)同步更改。流式復(fù)制在 WAL 產(chǎn)生時(shí)會流式地傳輸 WAL,而不是等待 WAL 文件填充完,從而可以更迅速地更新備用服務(wù)器。 邏輯復(fù)制遵循發(fā)布和訂閱模型,其中的更改基于數(shù)據(jù)的復(fù)制標(biāo)識(主鍵)而不是其物理位置,因此稱為“邏輯復(fù)制”。物理復(fù)制處理文件和目錄,而不考慮這些物理位置中的內(nèi)容。PostgreSQL 本身不提供多主復(fù)制,但有一些第三方工具提供了多主復(fù)制解決方案。 SQL Server SQL Server 復(fù)制將數(shù)據(jù)從發(fā)布服務(wù)器復(fù)制到訂閱服務(wù)器,并提供三種類型的復(fù)制:
SQL Server 中的復(fù)制可以是同步提交或異步提交。企業(yè)版提供了對等復(fù)制,以作為多主復(fù)制的替代解決方案。 集群PostgreSQL PostgreSQL 支持服務(wù)器集群,但本身不支持多主集群或雙主集群。repmgr 等工具可用來輕松維護(hù) PostgreSQL 集群。 SQL Server SQL Server 提供了 Windows Server 故障轉(zhuǎn)移集群,可針對主從和雙主節(jié)點(diǎn)進(jìn)行配置。標(biāo)準(zhǔn)版僅支持兩個(gè)節(jié)點(diǎn)的集群;更多的節(jié)點(diǎn)需要升級到企業(yè)版。 高可用PostgreSQL PostgreSQL 提供了多種解決方案來滿足用戶的高可用需求,包括共享磁盤故障轉(zhuǎn)移、預(yù)寫式日志傳輸、數(shù)據(jù)分區(qū)和多種復(fù)制方法。Patroni 等工具提供了自動故障轉(zhuǎn)移,通過監(jiān)控和識別數(shù)據(jù)庫故障來達(dá)成高可用。 SQL Server SQL Server 在其各個(gè)版本中包括了多個(gè)高可用工具。其中包括復(fù)制、日志傳送和故障轉(zhuǎn)移集群。其 Always On 可用性組(隨企業(yè)版提供)可在滿足特定條件時(shí)提供自動故障轉(zhuǎn)移。 視圖PostgreSQL PostgreSQL 支持視圖 – 本身不存儲數(shù)據(jù)的虛擬表。支持可更新的視圖,但是需要滿足以下條件,否則不會自動更新:
使用簡單查詢創(chuàng)建的視圖可以更新;使用復(fù)雜查詢創(chuàng)建的視圖不能更新,但可以使用規(guī)則更新復(fù)雜視圖。還支持物化視圖,并且可以使用 REFRESH MATERIALIZED VIEW 語句更新物化視圖中的數(shù)據(jù)。 SQL Server SQL Server 視圖可用于安全目的,限制用戶對數(shù)據(jù)的訪問。用戶定義視圖和系統(tǒng)定義視圖均受支持??梢允褂糜|發(fā)器自動更新視圖。當(dāng)對單個(gè)基礎(chǔ)基表中的列進(jìn)行修改并直接引用時(shí),可以更新視圖中的數(shù)據(jù)。物化視圖在 SQL Server 中稱為索引視圖;與其他關(guān)系數(shù)據(jù)庫中的物化視圖不同,索引視圖與底層數(shù)據(jù)同步,因此會自動更新。 觸發(fā)器PostgreSQL PostgreSQL 支持高級觸發(fā)器。支持的觸發(fā)事件包括 AFTER、BEFORE 和 INSTEAD OF,它們可應(yīng)用于 INSERT、UPDATE 和 DELETE 事件。當(dāng)觸發(fā)器觸發(fā)時(shí),它可以使用函數(shù)執(zhí)行復(fù)雜的 SQL 語句。PostgreSQL 可以動態(tài)執(zhí)行此操作。 SQL Server SQL Server 為不同類型的數(shù)據(jù)庫事件提供觸發(fā)器:
登錄觸發(fā)器允許您響應(yīng)用戶的會話建立事件。這些觸發(fā)器在身份驗(yàn)證成功后和建立用戶會話之前觸發(fā)。它們有助于審計(jì)和控制登錄活動。 存儲過程PostgreSQL PostgreSQL 支持以帶有 RETURN VOID 子句的用戶定義函數(shù),來定義存儲過程。PostgreSQL 支持以各種語言以及標(biāo)準(zhǔn) SQL 語法,編寫存儲過程。 SQL Server SQL Server 支持 Microsoft .NET Framework 支持的語言(普通運(yùn)行時(shí)語言或 CLR,如 VB、C# 或 Python),編寫存儲過程。 全文檢索PostgreSQL PostgreSQL 提供了用于全文搜索的高級功能。它使用全文索引和詞典來加快搜索速度。PostgreSQL 將預(yù)處理的文本文檔存儲為向量數(shù)據(jù)類型,將處理后的查詢存儲為其專用類型。預(yù)處理將文本文檔解析為稱為詞位的語言單位,這允許您以不區(qū)分大小寫的形式查找單詞。 SQL Server SQL Server 以可選組件提供了全文搜索。全文索引支持基于特定語言規(guī)則的搜索。使用 T-SQL 命令 CONTAINS 匹配單詞和短語,使用 FREETEXT 匹配含義,對列或文本數(shù)據(jù)類型(包括 char、varchar、nchar、nvarchar、text、ntext、image、xml 或 varbinary(max) 和 FILESTREAM)執(zhí)行搜索。同義詞庫文件可用于幫助查找搜索詞的同義詞。SQL Server 中的全文搜索不區(qū)分大小寫。 正則表達(dá)式PostgreSQL PostgreSQL 有三種方法來計(jì)算正則表達(dá)式:LIKE、SIMILAR TO 和 POSIX 正則表達(dá)式。 SQL Server SQL Server 本身不支持正則表達(dá)式計(jì)算;使用 T-SQL 函數(shù) LIKE、SUBSTRING 和 PATINDEX 可以獲得類似但有限的結(jié)果。 分區(qū)PostgreSQL PostgreSQL 支持內(nèi)置的范圍、列表和哈希分區(qū)。范圍分區(qū)將表分組為由分區(qū)鍵列或一組列定義的范圍,例如,按日期范圍。列表分區(qū)通過顯式列出每個(gè)分區(qū)中的預(yù)定義基本值,來將表分成多個(gè)組。 SQL Server SQL Server 支持表分區(qū)和索引分區(qū)。數(shù)據(jù)水平分區(qū),并將行組映射到各個(gè)分區(qū)。單個(gè)索引或表的所有分區(qū)必須駐留在同一個(gè)數(shù)據(jù)庫中,并且該表或索引在查詢和更新時(shí)被視為單個(gè)實(shí)體。 標(biāo)識列PostgreSQL PostgreSQL 在版本 10 中引入了一個(gè)名為 GENERATED AS IDENTITY 的新約束功能。這種 SERIAL 列的 SQL 標(biāo)準(zhǔn)中的變體,允許您自動為標(biāo)識列分配唯一值。 要使 SERIAL 列具有唯一約束或成為主鍵,現(xiàn)在必須要明確指定,就像其他數(shù)據(jù)類型一樣。唯一標(biāo)識符列是使用數(shù)據(jù)類型 smallserial、serial 和 bigserial 創(chuàng)建的,類似于其他數(shù)據(jù)庫中的自增列特性。 SQL Server SQL Server 的標(biāo)識列屬性為表創(chuàng)建一個(gè)標(biāo)識列,以便為行生成關(guān)鍵值。創(chuàng)建時(shí)指定兩個(gè)值: seed(第一行的初始值)和 increment(在上一行上增加的量)。默認(rèn)情況下,種子值和增量值均為 1。每個(gè)表只能包含一個(gè)標(biāo)識列。除非添加了 PRIMARY KEY 或 UNIQUE 約束,否則無法保證值的唯一性。 計(jì)算列PostgreSQL PostgreSQL 使用術(shù)語生成列來表示計(jì)算列。此功能是在版本 12 中引入的。生成列在標(biāo)記為 STORED 時(shí)可以物理存儲;否則,它們不會被存儲,稱為虛擬型。 CREATE TABLE table (...,computed_column GENERATED ALWAYS AS (expression) STORED); 生成列不能帶有標(biāo)識定義或作為分區(qū)鍵的一部分;它們只能引用當(dāng)前行,不能使用子查詢。不能在 INSERT 或 UPDATE 語句指定生成列的值,但可以接受關(guān)鍵字 DEFAULT。 SQL Server 除非使用 PERSISTED 屬性進(jìn)行標(biāo)記,否則 SQL Server 計(jì)算列不會以物理方式存儲在表中;僅當(dāng)值是確定性的或始終返回相同的結(jié)果時(shí),才能存儲該列。 ALTER TABLE tableADD computed_column AS expression [PERSISTED]; 如果計(jì)算列是確定性的,并且是可接受的數(shù)據(jù)類型,則可以將其用作 PRIMARY KEY 或索引,但不能添加 DEFAULT 或 FOREIGN KEY 約束。不能使用 INSERT 或 UPDATE 指定值。 整型PostgreSQL PostgreSQL 中有三種整數(shù):SMALLINT(小整數(shù),2 字節(jié)類型,范圍從 -32,768 到 32,767),INT(整數(shù),4 字節(jié)類型,范圍從 -2,147,483,648 到 2,147,483,647),BIGINT(大整數(shù):-9223372036854775808 到 9223372036854775807)。 SQL Server SQL SERVER 支持標(biāo)準(zhǔn) SQL 整數(shù)類型 BIGINT、INT、SMALLINT 和 TINYINT。每種類型的范圍和存儲大小如下: PostgreSQL 和 SQL Server 的整型對比表
布爾類型PostgreSQL PostgreSQL 布爾數(shù)據(jù)類型可以有三種狀態(tài):
SQL Server SQL SERVER 中的 BIT 數(shù)據(jù)類型表示 true/false 布爾值數(shù)據(jù)。BIT 字段的值為 1、0 或 null。 NoSQL 能力PostgreSQL 與許多其他關(guān)系數(shù)據(jù)庫一樣,PostgreSQL 增加了對 JSON 數(shù)據(jù)的支持,JSON 數(shù)據(jù)是存儲在 NoSQL 系統(tǒng)中的半結(jié)構(gòu)化數(shù)據(jù)的最常用格式。但是,由于 SQL 是與 PostgreSQL 數(shù)據(jù)庫交互的唯一方式,因此不應(yīng)將其視為 NoSQL。 SQL Server SQL Server 具有內(nèi)置的 JSON 函數(shù),使您能夠使用標(biāo)準(zhǔn) SQL 語言解析 JSON 文檔。您可以將 JSON 文檔存儲在 SQL Server 中,并像在 NoSQL 數(shù)據(jù)庫中一樣查詢 JSON 數(shù)據(jù)。不過,由于 SQL Server 是 SQL 數(shù)據(jù)庫,因此不應(yīng)將其視為 NoSQL。 分析函數(shù)PostgreSQL PostgreSQL 支持各種分析函數(shù),這些函數(shù)對一組行執(zhí)行聚合。有兩種類型的分析函數(shù):窗口函數(shù)和聚合函數(shù)。聚合函數(shù)執(zhí)行聚合并返回一組行的單個(gè)聚合值(如 sum、avg、min 或 max)。窗口函數(shù)為每行返回一個(gè)聚合值。 PostgreSQL 支持以下窗口函數(shù):
SQL Server SQL Server 的分析函數(shù)使您能夠直接在組內(nèi)計(jì)算移動平均值、運(yùn)行總計(jì)、百分比或前 N 個(gè)結(jié)果。 SQL Server 支持以下分析函數(shù):
管理和 GUI 工具PostgreSQL PostgreSQL 可以使用 Oracle SQL Developer、pgAdmin、OmniDB、DBeaver 和 Navicat,通過圖形用戶界面進(jìn)行管理。其他用于監(jiān)控運(yùn)行狀況和性能的 GUI 工具包括 Nagios、Zabbix、Cacti 和 Prometheus。SQLECTRON 是一個(gè)免費(fèi)和開源的跨平臺工具;它與多個(gè) SQL 數(shù)據(jù)庫兼容,包括 SQL Server。 SQL Server SQL Server 可以使用 SQL Server Management Studio(SSMS),這是 Windows 上免費(fèi)的圖形用戶界面管理工具。SQL Operations Studio 是一款適用于 Mac 的免費(fèi)開源跨平臺 GUI 工具。SQLECTRON 是一個(gè)免費(fèi)的開源跨平臺工具,與包括 PostgreSQL 在內(nèi)的多個(gè) SQL 數(shù)據(jù)庫兼容。 性能PostgreSQL PostgreSQL 在各種規(guī)模的數(shù)據(jù)集上,都有優(yōu)異的速度和性能,并且在在線事務(wù)處理(OLTP)和在線分析處理(OLAP)速度方面通常優(yōu)于其他數(shù)據(jù)庫。它提供了多版本并發(fā)控制 (MVCC),可同時(shí)處理多個(gè)事務(wù),死鎖比 SQL Server 少。PostgreSQL 提供了許多工具和參數(shù),允許用戶監(jiān)控和優(yōu)化數(shù)據(jù)庫性能。 SQL Server SQL Server 以其分析和事務(wù)處理的速度而出名。但是,由于 SQL Server 用戶協(xié)議,禁止在未經(jīng) Microsoft 事先書面批準(zhǔn)的情況下發(fā)布基準(zhǔn)測試,因此很少與其他數(shù)據(jù)庫系統(tǒng)進(jìn)行直接比較。SQL Server 在優(yōu)化性能和速度方面有一個(gè)突出的功能:In-Memory OLTP,它利用了內(nèi)存數(shù)據(jù)表的優(yōu)勢,訪問性能優(yōu)于直接寫入磁盤。SQL Server 標(biāo)準(zhǔn)版在內(nèi)存、分區(qū)、索引方面存在一些性能限制,還有一些功能需要升級到企業(yè)版。 并發(fā)PostgreSQL PostgreSQL 具有完善的多版本并發(fā)控制(MVCC),可同時(shí)處理多個(gè)過程。MVCC 提供數(shù)據(jù)庫信息的快照,以避免顯示由并發(fā)事務(wù)或其他數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)鎖定引起的不一致。它支持可序列化快照隔離(SSI)來保證事務(wù)隔離。 SQL Server SQL Server 的多版本并發(fā)控制系統(tǒng)開發(fā)得不太成熟,默認(rèn)情況下,它依賴于數(shù)據(jù)鎖定來防止并發(fā)事務(wù)出錯(cuò)。為了提高性能,它實(shí)現(xiàn)了樂觀并發(fā)。此方法會跳過行鎖定,而是在假定沖突很少出現(xiàn)的情況下,根據(jù)緩存版本驗(yàn)證任何更改。 應(yīng)用領(lǐng)域PostgreSQL PostgreSQL 是世界上最先進(jìn)的開源數(shù)據(jù)庫。全球企業(yè)都在使用 PostgreSQL 處理關(guān)鍵業(yè)務(wù)負(fù)載。PostgreSQL 社區(qū)和一些公司一直在確保 PostgreSQL 繼續(xù)在全球范圍內(nèi)拓展應(yīng)用。 SQL Server SQL Server 在依賴 Microsoft 產(chǎn)品的企業(yè)中很受歡迎。在過去的二十年里,隨著 Microsoft 通過其 Windows 服務(wù)器推動它,它的市場份額有所增加。然而,隨著近年來越來越多的企業(yè)轉(zhuǎn)向開源,SQL Server 的流行度曲線變得越來越平坦。 環(huán)境和技術(shù)棧PostgreSQL PostgreSQL 在 LAPP 技術(shù)棧(Linux、Apache、PostgreSQL 和 PHP/Python)中很受歡迎。LAPP 技術(shù)棧越來越受歡迎;Amazon 和 VMware 等大型平臺服務(wù)提供商都使用現(xiàn)成的 LAPP 技術(shù)棧模塊提供服務(wù)。 SQL Server SQL Server 是 Microsoft 技術(shù)棧中的常用組件。它包括 Microsoft WPF、ASP.NET、SharePoint 和 Office 365 等 Microsoft 技術(shù)。 調(diào)度任務(wù)PostgreSQL PostgreSQL 不像其他 SQL 數(shù)據(jù)庫那樣提供內(nèi)置的任務(wù)調(diào)度程序。定期任務(wù)需要外部工具,如 Linux 上的 pgAgent、cron 或 pg_cron,以及 Windows 上的 Task Scheduler 或 SQLBackupAndFTP。 SQL Server SQL Server Management Studio 可在 SQL Server 中調(diào)度任務(wù)。 訪問方法PostgreSQL PostgreSQL 可支持如下訪問方法、協(xié)議和 API 以訪問數(shù)據(jù):ADO.NET、JDBC、ODBC 和原生 C 庫等。它還支持用于二進(jìn)制大對象(BLOB)的流式處理 API。 SQL Server SQL Server 支持如下訪問方法、協(xié)議和 API 以訪問數(shù)據(jù):ADO.NET、JDBC、ODBC、OLE DB 和 TDS 等。 批量收集和綁定
同義詞SQL Server 支持同義詞。同義詞提供了一個(gè)抽象層,用于防止客戶端應(yīng)用程序?qū)A(chǔ)對象做出更改。同義詞屬于一個(gè)模式;與模式中的其他對象一樣,其名稱必須是唯一的。僅支持按名稱綁定;如果修改、刪除或替換基礎(chǔ)對象,則只能在運(yùn)行時(shí)發(fā)現(xiàn)缺失的引用。PostgreSQL 不支持同義詞。 該文章在 2024/10/8 20:43:00 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |