我有 1 个可以返回超过 1000 条记录的存储过程。
我想在我的搜索表列上创建临时非聚簇索引,因为我听说非聚簇索引会加速数据检索 (SELECT) 操作并减慢关闭数据更新(UPDATE 和 DELETE)操作并在我的操作完成后删除该非集群索引。
就像我有 2 个表 UserDetails 和 CategoryMaster 以及我的搜索字段:
- 用户详细信息(服务描述、技能)
- CategoryMaster(姓名)
这是我的存储过程:
ALTER PROCEDURE [dbo].[SearchworkerProcedure1]
@SearchKeyword nvarchar(70)
AS
DECLARE @Keywords TABLE
(
sno INT IDENTITY(1,1) PRIMARY KEY,
keyname VARCHAR(100),
Shortkeyname as substring(keyname,0,5)
)
DECLARE @SearchKeywordTable TABLE
(
[VendorId] [int] NULL,
[ServiceDescription] [nvarchar](max) NULL,
[Skills] [nvarchar](max) NULL
)
INSERT INTO @Keywords SELECT * FROM [splitstring_to_table](@SearchKeyword,',')
BEGIN
--My Query
END
我的UserDetails 创建查询:
CREATE TABLE [dbo].[UserDetails](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Fullname] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
那么是否可以在存储过程中创建临时非聚簇索引并在选择操作后删除该非聚簇索引????
最佳答案
临时索引不是个好主意。要索引表,需要扫描表 - 就像您使用当前设置对其执行 SELECT 一样。
您提到的字段上的永久(和临时)索引绝对没有任何效果,因为您的搜索条件具有前导通配符。无论如何,这将导致表扫描。
索引可能唯一有帮助的地方是连接中使用的外键列。但是,如果没有关于您的表格的任何有意义的尺寸统计信息,这只是一个猜测。
关于sql-server - 如何在我的搜索表列上创建临时非聚集索引并在选择操作后将其删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27372829/