突破索引长度限制
--Descript:利用CHECKSUM建立索引
USE tempdb ;
GO
--DROP TABLE dbo.T
CREATE TABLE dbo.T
(
ID INT PRIMARY KEY
IDENTITY(1, 1) ,
[Name] NVARCHAR(MAX)
) ;
--这里我偷懒一下,自己注意在IDE中,关闭,不要插入太多了.哈
WHILE 1 = 1
INSERT INTO dbo.T
SELECT CAST(NEWID() AS NVARCHAR(36))
SELECT *
FROM dbo.T
--表 'T'。扫描计数 1,逻辑读取 5059 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--SQL Server 执行时间:
-- CPU 时间 = 922 毫秒,占用时间 = 918 毫秒。
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT *
FROM dbo.T
WHERE [Name] = '0A1691D4-96B3-481E-9D97-FBC85B94BB03'
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
--消息 1919,级别 16,状态 1,第 1 行
--表 'dbo.T' 中的列 'Name' 的类型不能用作索引中的键列。一些大数据类型列还没发建立索引呢.怎么搞呢?
CREATE INDEX [IX_T_Name] ON dbo.T(Name) ;
--难道我们必须要表(聚集索引)扫描吗或者非全文索引,我们可以使用CHECKSUM 来做
ALTER TABLE dbo.T ADD Name_Idx AS (CHECKSUM(Name))
CREATE INDEX [IX_T_Name] ON dbo.T(Name_Idx)
--表 'T'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--SQL Server 执行时间:
--CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT *
FROM dbo.T
WHERE CHECKSUM('0A1691D4-96B3-481E-9D97-FBC85B94BB03') = Name_Idx
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
--上述也只是出苗粗描了一下,建立索引的话,是不能超过900字节的字段的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器