小编bri*_*ian的帖子

当 nvarchar(4000) 99% 的时间都足够时,存储大数据的最佳做法是什么?

我有一个大约 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[?],从而大大增加了进行此更改所需的时间。(不确定以后读/写时间会受到怎样的影响)。

我想到了一些可能的选择......

  1. 将 DataValue 从 nvarchar(4000) 更改为 nvarchar(max) 并消耗进行更改所需的时间;不用担心只有 1% 的行正在使用MAX

  2. 除了 DataValue,添加一个 nvarchar(max) 的 DataValueXL 列并引入应用程序逻辑以根据数据的大小保存在适当的列中?(都标记为NULL

  3. 创建一个 FKed 到 UserDataId 的新表以仅存储大于 4000 的大数据值?

我应该和哪个——如果有的话——一起去?

谢谢

sql-server-2005 sql-server

6
推荐指数
1
解决办法
2344
查看次数

索引视图上的操作是否并行发生?

当我插入具有聚集索引视图的表时,估计的执行计划似乎并行执行表插入和视图的聚集索引插入操作。

  1. 这是真的?
  2. 为什么 %s 加起来不是 100%?

下面是一个有点人为的例子。

/*
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)

索引视图更新

index sql-server-2005 execution-plan materialized-view

3
推荐指数
1
解决办法
155
查看次数