本文系統比較 SQL Server (T-SQL) 與 Oracle (PL/SQL) 在架構、語法、管理、效能等 50+ 關鍵維度的差異,協助跨平台開發、遷移評估與技術選型。
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 01 | 記憶體管理 | 動態/靜態兩種模式,自動調整 | SGA/PGA 精細參數控制 (init.ora/spfile) |
| 02 | 資料庫 vs 結構描述 | 資料庫 = 獨立單位,跨庫需三部分命名 | 結構描述 = 使用者,單資料庫多結構描述 |
| 03 | 檔案組 vs 表空間 | 檔案組 (Filegroup) 邏輯分組 | 表空間 邏輯儲存單位,含永久/暫時/UNDO |
| 04 | 頁面大小 | 固定 8KB 頁,區段 64KB (8頁) | 可配置 2K/4K/8K/16K/32K (db_block_size) |
| 05 | 段/區/塊 | Heap/B-Tree 索引結構 | 段(資料/索引/UNDO/臨時)→區→塊 |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 06 | 復原模式 | SIMPLE / FULL / BULK_LOGGED | NOARCHIVELOG / ARCHIVELOG |
| 07 | 日誌架構 | 單一交易記錄檔 (LDF),循環寫入 | Redo Log Group 多重化,歸檔自動切換 |
| 08 | 備份類型 | 完整/差異/記錄/檔案組 | 物理備份 (RMAN) / 邏輯備份 (EXP/IMP) |
| 09 | 還原模式 | 完整還原 / 時間點還原 | 完整 / 不完整 (取消/時間/SCN/換檔) |
| 10 | 附加資料庫 | 支援脫離/附加 (移動資料庫) | 可傳輸表空間 (TTS) 跨平台移動 |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 11 | 隔離等級 | 4 種 (READ UNCOMMITTED 到 SERIALIZABLE) | 2 種 (READ COMMITTED / SERIALIZABLE) |
| 12 | 預設隔離 | READ COMMITTED (共享鎖) | READ COMMITTED (多版本一致性讀) |
| 13 | 鎖升級 | 自動列→頁→表升級 | 無鎖升級,列級鎖永不升級 |
| 14 | 讀寫阻塞 | 讀寫互相阻塞 (預設) | 讀寫不阻塞 (UNDO 區段提供一致性讀) |
| 15 | 死鎖處理 | 自動偵測、犧牲者回滾 (1205 錯誤) | 自動偵測、犧牲者回滾 (ORA-00060) |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 16 | 外鍵級聯 | ON DELETE CASCADE / ON UPDATE CASCADE | 僅 ON DELETE CASCADE |
| 17 | 暫存表 | #區域 / ##全域,工作階段結束自動刪除 | GLOBAL TEMPORARY TABLE,定義永久、資料隔離 |
| 18 | 型別轉換 | CAST / CONVERT / TRY_CAST / TRY_CONVERT | TO_CHAR / TO_NUMBER / TO_DATE / CAST |
| 19 | 自動編號 | IDENTITY (種子/遞增) | SEQUENCE (NEXTVAL/CURVAL),12c+ IDENTITY |
| 20 | 分區表 | 2005+ 分區檢視/2008+ 真分區表 | RANGE/HASH/LIST/REFERENCE/INTERVAL 成熟分區 |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 21 | 結果集返回 | 直接 SELECT 返回結果集給用戶端 | 需 REF CURSOR / SYS_REFCURSOR 返回 |
| 22 | 參數長度 | 字串參數需指定長度 | 字串參數不指定長度 |
| 23 | 觸發器類型 | DML 觸發器 (FOR/AFTER/INSTEAD OF) | DML (ROW/STATEMENT) + DDL + 系統事件 |
| 24 | 觸發器判斷操作 | 檢查 INSERTED/DELETED 虛擬表 | INSERTING/UPDATING/DELETING 布林函數 |
| 25 | 游標判斷結束 | @@FETCH_STATUS = 0 | %FOUND / %NOTFOUND / %ROWCOUNT |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 26 | TOP N 查詢 | SELECT TOP N * FROM ... | WHERE ROWNUM <= N (12c+ FETCH FIRST N ROWS) |
| 27 | 分頁查詢 | OFFSET ... ROWS FETCH NEXT ... (2012+) | ROWNUM 子查詢 / ROW_NUMBER() 分析函數 |
| 28 | 字串連接 | + 號 | \|\| 運算子 |
| 29 | 單引號跳脫 | 兩個單引號 '' | 兩個單引號 '' 或 q'[...]' 引用符 |
| 30 | 雙表差值計算 | 自連接 + IDENTITY 建立序號 | LAG/LEAD 分析函數 / ROWNUM 自連接 |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 31 | 排序函數 | ROW_NUMBER / RANK / DENSE_RANK (2005+) | ROW_NUMBER / RANK / DENSE_RANK (9i+) |
| 32 | 分組排序 | PARTITION BY 子句 | PARTITION BY 子句 |
| 33 | MERGE 語法 | MERGE INTO ... USING ... ON ... WHEN MATCHED/NOT MATCHED | 相同語法 (9i+) |
| 34 | WITH 子查詢 (CTE) | WITH cte AS (...) SELECT ... (2005+) | WITH cte AS (...) SELECT ... (9i+) |
| 35 | PIVOT/UNPIVOT | PIVOT/UNPIVOT 運算子 (2005+) | PIVOT/UNPIVOT 子句 (11g+) |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 36 | 系統觸發器 | 無 (DDL 觸發器 2005+) | 啟動/關閉/登入/錯誤/暫停 系統觸發器 |
| 37 | 工作排程 | SQL Server Agent 作業 | DBMS_JOB / DBMS_SCHEDULER (10g+) |
| 38 | 動態 SQL | EXEC(@sql) / sp_executesql | EXECUTE IMMEDIATE / DBMS_SQL |
| 39 | 物件加密 | WITH ENCRYPTION | WRAP 工具 (PL/SQL 加密) |
| 40 | 區塊修復 | DBCC CHECKDB / REPAIR | DBMS_REPAIR 套件 |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 41 | OS 檔案讀寫 | xp_cmdshell / BULK INSERT / OPENROWSET | UTL_FILE 套件 (需 UTL_FILE_DIR) |
| 42 | 異構資料存取 | Linked Server / OPENQUERY / OPENDATASOURCE | Database Link / Transparent Gateway |
| 43 | XML 處理 | 原生 xml 型別、XQuery、XML 索引 | XMLType、XQuery、XMLIndex (11g+) |
| 44 | 隨機數 | RAND() / CRYPT_GEN_RANDOM() | DBMS_RANDOM.VALUE / SYS_GUID() |
| 45 | 系統時間 | GETDATE() / SYSDATETIME() | SYSDATE / SYSTIMESTAMP / CURRENT_DATE |
| # | 特性 | SQL Server | Oracle |
|---|---|---|---|
| 46 | 延遲執行 | WAITFOR DELAY '00:01:00' / WAITFOR TIME | DBMS_LOCK.SLEEP(秒) / DBMS_SESSION.SLEEP |
| 47 | 伺服器 IP | xp_cmdshell 'ipconfig' 解析 | SYS_CONTEXT('USERENV','IP_ADDRESS') / UTL_INADDR |
| 48 | 物件重命名 | sp_rename 'old', 'new' / sp_renamedb | RENAME old TO new / ALTER TABLE RENAME COLUMN |
| 49 | GUID 產生 | NEWID() / NEWSEQUENTIALID() | SYS_GUID() / RAWTOHEX(SYS_GUID()) |
| 50 | 閃回查詢 | 無原生對應 (時間點還原/資料庫快照) | AS OF SCN / AS OF TIMESTAMP (9i+) |
| 遷移方向 | 主要挑戰 | 建議工具/策略 |
|---|---|---|
| SQL Server → Oracle | T-SQL → PL/SQL 改寫、IDENTITY → SEQUENCE、鎖行為差異 | SQL Developer Migration Workbench、SSMA for Oracle |
| Oracle → SQL Server | PL/SQL → T-SQL、REF CURSOR 處理、分區表語法、Package 拆解 | SSMA for SQL Server、手動重寫關鍵邏輯 |