我有一个大约 100MM 行的表,用于存储有关用户的信息。
CREATE TABLE [dbo].[UserData](
[UserDataID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[DataId] int NOT NULL,
[DataValue] [nvarchar](4000) NOT NULL,
[EncryptedDataValue] [varbinary](max) NULL)
Run Code Online (Sandbox Code Playgroud)
我需要能够将数据存储在大于 nvarchar(4000) 的 DataValue 中。但是,实际上只有很小一部分的行需要将此列作为 nvarchar(max)。我知道一旦 DataValue 超过 nvarchar(4000),在内部,sql 会将数据存储为 blob[?],从而大大增加了进行此更改所需的时间。(不确定以后读/写时间会受到怎样的影响)。
我想到了一些可能的选择......
将 DataValue 从 nvarchar(4000) 更改为 nvarchar(max) 并消耗进行更改所需的时间;不用担心只有 1% 的行正在使用MAX?
除了 DataValue,添加一个 nvarchar(max) 的 DataValueXL 列并引入应用程序逻辑以根据数据的大小保存在适当的列中?(都标记为NULL)
创建一个 FKed 到 UserDataId 的新表以仅存储大于 4000 的大数据值?
我应该和哪个——如果有的话——一起去?
谢谢
当我插入具有聚集索引视图的表时,估计的执行计划似乎并行执行表插入和视图的聚集索引插入操作。
下面是一个有点人为的例子。
/*
DROP INDEX [IX__AView] ON [dbo].[_AView]
DROP VIEW _AView
DROP TABLE _A
*/
CREATE TABLE _A (Name VARCHAR(10) NOT NULL)
GO
CREATE VIEW _AView WITH SCHEMABINDING AS
SELECT Name FROM [dbo]._A
GO
CREATE UNIQUE CLUSTERED INDEX [IX__AView] ON [dbo].[_AView] ([Name] ASC)
GO
/*
--run the estimated execution on this
INSERT INTO _A (Name) values ('cheese')
*/
Run Code Online (Sandbox Code Playgroud)
