我有一個包含以下列的表格
Id - Int Primary key Identity column
Name - Varchar(100)
OrderValue - int
OrderDate - date
OrderState - varchar(100)
列 (Name, orderValue) 具有唯一鍵約束和唯一的非聚集索引。
我們有一個新要求,OrderValue 列將開始接收字串、浮點數、guid。我們現在擁有的兩個選項是將 orderValue 的資料型別更改為 Varchar(100) 或 SQL_Variant。我的隊友支持 sql_variant。他們的理由是,由于 orderValue 是唯一非聚集索引的一部分,更改它 sql_variant 將使索引表中的索引鍵的排序變得容易,因為相同型別的所有資料型別都存盤在一起。我不太熟悉 Sql_variant 以及如何為 sql_variants 存盤索引,但我讀過 sql_variant 的性能通常很差。在我們的例子中,什么是好的選擇?當非聚集索引將其中一列作為 sql_variant 時,它們如何作業?
uj5u.com熱心網友回復:
我自己從未使用過這種資料型別。
訂購
從閱讀檔案,特別是價值比較部分我可以看出,在某些情況下,排序看起來并不“自然”,例如
CREATE TABLE #Test( a SQL_VARIANT )
INSERT INTO #Test VALUES( 2 ) -- INT
INSERT INTO #Test VALUES( 2.1 ) -- DECIMAL
INSERT INTO #Test VALUES( '3' ) -- VARCHAR
INSERT INTO #Test VALUES( CAST( 1.8 AS FLOAT ) )
INSERT INTO #Test VALUES( DATEFROMPARTS( 2020, 1, 1 ) )
SELECT *, SQL_VARIANT_PROPERTY ( a , 'BaseType' ) FROM #Test ORDER BY a
DROP TABLE #Test
結果(按 cola升序排列):
a
-------------------------- -----------
3 varchar
2 int
2.1 numeric
1.8 float
2020-01-01 00:00:00.000 date
指數表現
我認為索引搜索不會有任何性能問題。插入和更新可能會受到懲罰
陷阱
使用這種資料型別時會有很多小問題。一些例子如下:
1| WHERE除非資料型別匹配,否則條件將不匹配:
-- Returns nothing
SELECT *, SQL_VARIANT_PROPERTY ( a , 'BaseType' ), SQL_VARIANT_PROPERTY ( a , 'TotalBytes' )
FROM #Test
WHERE a = '2'
ORDER BY a
-- Returns nothing
SELECT *, SQL_VARIANT_PROPERTY ( a , 'BaseType' ), SQL_VARIANT_PROPERTY ( a , 'TotalBytes' )
FROM VariantTest
WHERE a = 3
ORDER BY a
2| 這不會插入具有正確資料型別的資料,因為資料型別將首先隱式轉換為,VARCHAR然后再轉換為SQL_VARIANT:
INSERT INTO #Test VALUES( 2 ), ( 2.1 ), ( '3' ), CAST( 1.8 AS FLOAT )
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337066.html
標籤:sql sql-server 查询语句 姐姐 msbi
