如何在我的搜索表列上创建临时非聚簇索引并在选择操作后将其删除

时间:2014-12-09 06:37:44

标签: sql-server stored-procedures indexing non-clustered-index

我有1个存储过程,可以返回1000多条记录。

我想在搜索表列上创建临时非群集索引,因为我听说非群集索引会加快数据检索(SELECT)操作并且速度慢关闭数据更新(UPDATE和DELETE)操作,并在我的操作完成后删除该非集群索引。

就像我有2个表UserDetails和CategoryMaster以及我的搜索结果:

  • 的UserDetails (ServiceDescription,技能)
  • 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]

可以在存储过程中创建临时非群集索引,并在选择操作后删除非群集索引 ????

1 个答案:

答案 0 :(得分:1)

临时索引是一个坏主意。要对表进行索引,需要扫描一个表 - 就像使用当前设置对其进行SELECT一样。

您提到的字段上的永久(和临时)索引绝对没有任何效果,因为您的搜索条件具有前导通配符。无论如何,这将导致表格扫描。

索引可能帮助的唯一位置在连接中使用的外键列上。但是,如果没有关于yoiur表的任何有意义的大小统计数据,那就是猜测。