作者:Digital Observer(施嘉偉)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年數據庫行業經驗,現主要從事數據庫服務工作
擁有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技術專家、達夢師資認證、數據安全咨詢高級等認證
ITPUB認證專家、PolarDB開源社區技術顧問、HaloDB技術顧問、TiDB社區技術布道師、青學會MOP技術社區專家顧問、國內某高校企業實踐指導教師
公眾號:Digital Observer;CSDN:施嘉偉;ITPUB:sjw1933;墨天輪:Digital Observer;PGFans:施嘉偉。
一、測試背景
隨著國產數據庫的發展,SQL Server 用戶在遷移至國產平臺時,最關注的問題之一就是語法兼容性和功能支持。KingbaseES 作為具備“多語法引擎”能力的國產數據庫,正在不斷增強對主流數據庫的兼容能力。
本次測試是針對 KingbaseES V009R004C01 版本的 SQL Server 兼容能力進行驗證,重點評估其對 SQL Server 特性語法、數據類型、事務控制、索引重建等方面的支持程度。
二、測試環境說明
KingbaseES 版本:V009R004C012(X64_Linux)
SQL Server 版本:Microsoft SQL Server 2008 R2 (SP2) 10.50.4042.0 (X64)
三、測試步驟
1.?特殊數據類型與對象
ROWVERSION / TIMESTAMP
- 測試目標:驗證?
ROWVERSION(或?TIMESTAMP)在表中的自動更新行為。
- SQL Server 特性:
ROWVERSION?類型用于標識表的版本,每次更新行時會自動生成新版本號。
CREATE TABLE test_rowversion (
id INT PRIMARY KEY,
version ROWVERSION
);
INSERT INTO test_rowversion (id) VALUES (1);
UPDATE test_rowversion SET id = 2 WHERE id = 1;
CREATE TABLE test_rowversion (
id INT PRIMARY KEY,
version ROWVERSION
);
INSERT INTO test_rowversion (id) VALUES (1);
UPDATE test_rowversion SET id = 2 WHERE id = 1;
> Affected rows: 1
Affected rows: 1
> 查詢時間: 4.586s
 |
| 圖1-1 |
- Kingbase 驗證:模擬?
ROWVERSION,驗證表中數據每次更新時是否會自動生成新值。
CREATE TABLE test_rowversion (
id INT PRIMARY KEY,
version ROWVERSION
)
> OK
> 查詢時間: 0.362s
INSERT INTO test_rowversion (id) VALUES (1)
> Affected rows: 1
> 查詢時間: 0.186s
UPDATE test_rowversion SET id = 2 WHERE id = 1
> Affected rows: 1
> 查詢時間: 0.132s
 |
| 圖1-2 |
SQL_VARIANT
- 測試目標:檢查?
SQL_VARIANT?數據類型的兼容性,并確保可以存儲不同類型的數據。
- SQL Server 特性:
SQL_VARIANT?可以存儲不同類型的數據,如?INT,?VARCHAR,?DATE?等。
CREATE TABLE test_sql_variant (
id INT PRIMARY KEY,
value SQL_VARIANT
);
INSERT INTO test_sql_variant (id, value) VALUES (1, 100);
INSERT INTO test_sql_variant (id, value) VALUES (2, 'Hello');
INSERT INTO test_sql_variant (id, value) VALUES (3, '2025-07-22');
CREATE TABLE test_sql_variant (
id INT PRIMARY KEY,
value SQL_VARIANT
);
INSERT INTO test_sql_variant (id, value) VALUES (1, 100);
INSERT INTO test_sql_variant (id, value) VALUES (2, 'Hello');
INSERT INTO test_sql_variant (id, value) VALUES (3, '2025-07-22');
> Affected rows: 1
Affected rows: 1
Affected rows: 1
> 查詢時間: 9.482s
 |
| 圖1-3 |
- Kingbase 驗證:檢查是否支持通過類似的類型(如?
JSON?或?TEXT)模擬?SQL_VARIANT?行為。
CREATE TABLE test_sql_variant (
id INT PRIMARY KEY,
value SQL_VARIANT
)
> OK
> 查詢時間: 0.653s
INSERT INTO test_sql_variant (id, value) VALUES (1, 100)
> Affected rows: 1
> 查詢時間: 0.167s
INSERT INTO test_sql_variant (id, value) VALUES (2, 'Hello')
> Affected rows: 1
> 查詢時間: 0.099s
INSERT INTO test_sql_variant (id, value) VALUES (3, '2025-07-22')
> Affected rows: 1
> 查詢時間: 0.134s
 |
| 圖1-4 |
UNIQUEIDENTIFIER
- 測試目標:驗證?
UNIQUEIDENTIFIER?數據類型的兼容性,存儲全局唯一標識符(GUID)。
- SQL Server 特性:使用?
NEWID()?生成唯一標識符。
CREATE TABLE test_uniqueidentifier (
id UNIQUEIDENTIFIER PRIMARY KEY
);
INSERT INTO test_uniqueidentifier (id) VALUES (NEWID());
CREATE TABLE test_uniqueidentifier (
id UNIQUEIDENTIFIER PRIMARY KEY
);
INSERT INTO test_uniqueidentifier (id) VALUES (NEWID());
> Affected rows: 1
> 查詢時間: 1.100s
 |
| 圖1-5 |
- Kingbase 驗證:驗證?
UUID?類型與 SQL Server 的?UNIQUEIDENTIFIER?是否兼容,并比較生成的 GUID 是否符合要求。
CREATE TABLE test_uniqueidentifier (
id UNIQUEIDENTIFIER PRIMARY KEY
)
> OK
> 查詢時間: 0.751s
INSERT INTO test_uniqueidentifier (id) VALUES (NEWID())
> Affected rows: 1
> 查詢時間: 0.084s
 |
| 圖1-6 |
SYSNAME
- 測試目標:模擬?
SYSNAME?數據類型,通常用于存儲對象的名稱,如表名或列名。
- SQL Server 特性:
SYSNAME?實際上是?NVARCHAR(128),用于存儲系統名稱。
CREATE TABLE test_sysname (
sysname_col SYSNAME
);
INSERT INTO test_sysname (sysname_col) VALUES ('TestSystemName');
CREATE TABLE test_sysname (
sysname_col SYSNAME
);
INSERT INTO test_sysname (sysname_col) VALUES ('TestSystemName');
> Affected rows: 1
> 查詢時間: 5.150s
 |
| 圖1-7 |
- Kingbase 驗證:使用?
VARCHAR?或?TEXT?來模擬,并測試其兼容性。
CREATE TABLE test_sysname (
sysname_col SYSNAME
)
> OK
> 查詢時間: 0.702s
INSERT INTO test_sysname (sysname_col) VALUES ('TestSystemName')
> Affected rows: 1
> 查詢時間: 0.099s
 |
| 圖1-8 |
2.?SQL 語句支持
NOWAIT / SKIP LOCKED
- 測試目標:測試鎖定行為,確保?
NOWAIT?和?SKIP LOCKED?在并發情況下按預期工作。
- SQL Server 特性:
NOWAIT?用于在等待鎖定時立即返回錯誤,而?SKIP LOCKED?會跳過已鎖定的行。
BEGIN TRANSACTION;
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE NOWAIT;
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE SKIP LOCKED;
BEGIN TRANSACTION;
SELECT * FROM test_rowversion WITH (UPDLOCK, ROWLOCK, READPAST) WHERE id = 1;
COMMIT TRANSACTION;
BEGIN TRANSACTION;
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE NOWAIT;
> Line 2: FOR UPDATE clause allowed only for DECLARE CURSOR.
> [42000] [FreeTDS][SQL Server]Line 2: FOR UPDATE clause allowed only for DECLARE CURSOR. (1003)
> 查詢時間: 0.023s
BEGIN TRANSACTION;
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE SKIP LOCKED;
> Line 2: FOR UPDATE clause allowed only for DECLARE CURSOR.
> [42000] [FreeTDS][SQL Server]Line 2: FOR UPDATE clause allowed only for DECLARE CURSOR. (1003)
> 查詢時間: 2.288s
 |
| 圖2-1 |
 |
| 圖2-2 |
- Kingbase 驗證:驗證?
FOR UPDATE NOWAIT?和?FOR UPDATE SKIP LOCKED?是否按預期工作。
BEGIN TRANSACTION
> OK
> 查詢時間: 0.043s
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE NOWAIT
> Affected rows: 0
> 查詢時間: 0.033s
BEGIN TRANSACTION
> OK
> 查詢時間: 0.039s
SELECT * FROM test_rowversion WHERE id = 1 FOR UPDATE SKIP LOCKED
> Affected rows: 0
> 查詢時間: 0.022s
 |
| 圖2-3 |
 |
| 圖2-4 |
FOR XML
- 測試目標:驗證?
FOR XML?子句,將查詢結果轉換為 XML 格式。
- SQL Server 特性:SQL Server 的?
FOR XML?允許將查詢結果格式化為 XML。
SELECT id FROM test_rowversion FOR XML PATH('row');
 |
| 圖2-5 |
- Kingbase 驗證:驗證是否支持 XML 輸出,并測試性能。
 |
| 圖2-6 |
3.?列屬性(GUID都沒有生成)
ROWGUIDCOL
- 測試目標:測試?
ROWGUIDCOL?列屬性,該屬性用于標識存儲 GUID 的列,并確保其在數據插入時按預期工作。
- SQL Server 特性:
ROWGUIDCOL?是專門用于存儲 GUID 的列屬性,通常與?UNIQUEIDENTIFIER?一起使用。
CREATE TABLE test_rowguidcol2 (
id INT PRIMARY KEY,
guid_column UNIQUEIDENTIFIER ROWGUIDCOL DEFAULT NEWSEQUENTIALID()
);
INSERT INTO test_rowguidcol2 (id) VALUES (1);
 |
| 圖3-1 |
- Kingbase 驗證:測試是否能使用?
UUID?列屬性來模擬?ROWGUIDCOL,并測試插入時是否自動生成 GUID。
 |
| 圖3-2 |
4.?索引重建
INDEX…REBUILD
- 測試目標:驗證索引重建功能,確保能夠重建已有索引。
- SQL Server 特性:
INDEX...REBUILD?用于重建索引。
CREATE INDEX idx_test_rowversion ON test_rowversion (id);
ALTER INDEX idx_test_rowversion REBUILD;
ALTER INDEX idx_test_rowversion ON test_rowversion REBUILD;
> OK
> 查詢時間: 3.853s
- Kingbase 驗證:測試索引重建命令?
REBUILD INDEX?是否有效。
ALTER INDEX idx_test_rowversion ON test_rowversion REBUILD
> WARNING: Does not verify whether index is related to table
LINE 1: ALTER INDEX idx_test_rowversion ON test_rowversion REBUILD
^
> OK
> 查詢時間: 0.215s
5.?事務與并發控制
隔離級別
- 測試目標:驗證不同隔離級別的事務控制功能,確保支持?
READ COMMITTED、SERIALIZABLE?等隔離級別。
 |
| 圖5-1 |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
COMMIT;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
COMMIT;
> OK
> 查詢時間: 0.443s
 |
| 圖5-2 |
- Kingbase 驗證:測試事務隔離級別是否按預期工作
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
> WARNING: SET TRANSACTION can only be used in transaction blocks
> OK
> 查詢時間: 0.080s
BEGIN TRANSACTION
> OK
> 查詢時間: 0.023s
COMMIT
> OK
> 查詢時間: 0.868s
 |
| 圖5-3 |
五、評測結語與建議
本次測試結果表明,KingbaseES V9 在SQL Server的兼容能力方面表現良好,尤其是在特殊數據類型、SQL語句支持和列屬性方面實現了較好的兼容。然而,在部分場景中存在一些改進的地方:
1、 提供更詳細的兼容性文檔,指導用戶進行 SQL Server 到 KingbaseES 的遷移。
2、 持續增強“多語法引擎”的能力,以覆蓋更多 SQL Server 特性和語法。
3、 針對測試中發現的警告和錯誤信息,進行深入分析并給出解決方案或替代方案。其中較為明顯的是【圖1-1】和圖【1-2】,以及【圖2-5】和圖【2-6】的字段顯示.
4、 也有做的較好的地方,sqlserver不支持的語法,KingbaseES V9可以執行,比如圖【2-1】和【2-2】
