--本用例在SQL SERVER 2019 测试通过
select @@VERSION
--Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 18363: )
--创建表并插入数据
create table tviewindex(ci int identity(1,1),cvb VARBinary(200));
truncate table tviewindex;
insert into tviewindex(cvb) values (ENCRYPTBYPASSPHRASE('test', CONVERT(VARCHAR(200),NEWID()), 1, CONVERT( varbinary,'fjw' )));
go 1000
select * from tviewindex
--创建视图
CREATE VIEW dbo.V_VIEWINDEX
WITH SCHEMABINDING
AS
select ci,CONVERT( VARCHAR(4000),DECRYPTBYPASSPHRASE('test',cvb, 1,CONVERT( varbinary, 'fjw'))) AS CVB
from dbo.tviewindex t ;
创建唯一聚簇索引(必须)
create UNIQUE CLUSTERED index idx_vvi on V_VIEWINDEX(ci);
创建普通索引(可选)
create index idx_vvi2 on V_VIEWINDEX(cvb);
--警告! 聚集的 索引的最大键长度为 900 个字节。索引“idx_vvi”的最大长度为 4000 个字节。对于某些大值组合,插入/更新操作将失败。
--警告! 非聚集的 索引的最大键长度为 1700 个字节。索引“idx_vvi2”的最大长度为 4000 个字节。对于某些大值组合,插入/更新操作将失败。
--SQL SERVER2012企业版报错:无法对视图 'test01.dbo.V_VIEWINDEX' 创建 索引。函数 'DecryptByPassPhrase' 生成具有不确定性的结果。请使用具有确定性的系统函数,或者修改用户定义函数以返回具有确定性的结果。
--默认情况下,如下语句不使用索引
select * from dbo.V_VIEWINDEX
where CVB='EF312B77-0133-4CD3-BD5F-CEB753F18FCD'
添加WITH (NOEXPAND)选项后使用索引
select * from dbo.V_VIEWINDEX WITH (NOEXPAND)
where CVB='EF312B77-0133-4CD3-BD5F-CEB753F18FCD'