我將創建一個包含存盤 128 位無符號值的特定列的表。
我有以下限制:
我應該在盡可能短的時間內查詢此列中以前的重復值(注意:這不是唯一性約束)。
我應該插入具有低計時開銷的值。
記錄數可能在數千萬左右(例如 90M)。
我想將列值顯示為十六進制。
我想使用十六進制輸入字串查詢列值。
根據這個答案,建議使用 binary[16] 來存盤 128 位值(不考慮約束)。
所以我的問題是哪種資料型別適合我的列資料型別?(字符(32),二進制(16),...)。
我目前正在使用char(32)以十六進制表示形式存盤 128 位值,我想知道我是否可以提高我的資料庫性能?我猜因為數字是作為文本值存盤和處理的,它會降低資料庫查詢性能,并且可能存在性能更好的資料型別。
uj5u.com熱心網友回復:
binary(16)是最適合 128 位無符號值的列資料型別,因為 SQL Server 沒有 128 位無符號型別。與char(32).
我應該在盡可能短的時間內查詢此列中以前的重復值(注意:這不是唯一性約束)。
在列上創建索引以避免全表掃描。
我應該插入具有低計時開銷的值。
上述索引存在較小的插入性能成本,但會被運行時節省所抵消。
記錄數可能在數千萬左右(例如 90M)。
一個 100M 的行表只有幾 GB(取決于行大小),并且如果經常使用該表,它可能會駐留在足夠大小的 SQL 實體上。
我想將列值顯示為十六進制。
與所有顯示格式一樣,這項任務最好在表示層完成,但也可以在 T-SQL 中完成。
我想使用十六進制輸入字串查詢列值。
理想情況下,查詢時應該匹配列資料型別,但如果需要,可以將十六進制字串顯式轉換為二進制。
示例 T-SQL:
CREATE TABLE dbo.YourTable (
YourTableID int NOT NULL CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
, BinaryValue binary(16) NOT NULL INDEX idx_BinaryValue NONCLUSTERED
, OtherData varchar(50) NOT NULL
);
INSERT INTO dbo.YourTable VALUES(1,0X000102030405060708090A0B0C0D0E0F,'example 1');
INSERT INTO dbo.YourTable VALUES(2,0X000102030405060708090A0B0C0D0E00,'example 2');
INSERT INTO dbo.YourTable VALUES(3,0X000102030405060708090A0B0C0D0E0F,'example 3 duplicate value');
--example query values
DECLARE @BinaryValue binary(16) = 0X000102030405060708090A0B0C0D0E0F;
DECLARE @CharValue char(32) = '000102030405060708090A0B0C0D0E0F';
--matching type query
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = @BinaryValue;
--query with hex string
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = CONVERT(binary(16), @CharValue, 2);
GO
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323667.html
標籤:sql-server 数据库 sql数据类型
