我在 sqlserver 中有一個包含一些 nvarchar(MAX) 列的表。
現在,這些列中的大多數都存盤了幾百行文本,這使得表格占用了大量磁盤空間。
如何減小表的大小,可以更改列的型別,而不會丟失資料?
uj5u.com熱心網友回復:
如果您的資料沒有任何 unicode 字符,您可以使用varchar (max),它使用 nvarchar(max) 的一半空間。但是如果你有 unicode 字符,它們將被 '?' 替換,所以你會丟失資料。
您擁有的另一個選項是激活表上的資料壓縮。您可以在 SQL Server Management Studio 的資料壓縮向導上執行此操作
uj5u.com熱心網友回復:
值得考慮在表上使用聚集列存盤索引的可能性,因為它提供了高資料壓縮率。
例如:
Create Table [dbo].[Tbl] (ID Int Identity(1,1), Txt nVarChar(max))
Declare @Cnt Int = 0
Declare @LowerNum Int = 500
Declare @UpperNum Int = 8000
Declare @Length Int
-- filling in the table with data
While @Cnt < 20000
Begin
Select @Length = Round(((@UpperNum - @LowerNum) * Rand()) @LowerNum, 0)
Insert Into [dbo].[Tbl] (Txt)
Select Txt
From OpenJson((Select Txt From (Select crypt_gen_random(@Length) As Txt) As R For Json Auto)) With (Txt nVarChar(max))
Set @Cnt = @Cnt 1
End
在 [ID] 列上創建聚集主鍵。
ALTER TABLE [dbo].[Tbl] ADD CONSTRAINT [PK_Tbl] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
FILLFACTOR = 90, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
ON [PRIMARY]
在這種情況下,表的大小約為 250MB。
讓我們創建一個聚集列存盤索引而不是一個聚集主鍵。
CREATE CLUSTERED COLUMNSTORE INDEX [PK_Tbl] ON [dbo].[Tbl] WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
現在表的大小約為 135MB。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341132.html
標籤:sql-server
