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

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

我有 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/

相关文章:

python - 我如何找到字符串中多个子字符串的位置(Python 3.4.3 shell)

python - 如何使用 sqlalchemy 从 ubuntu 连接远程 Windows MSSQL 服务器

node.js - 如何修复 'Unclosed quotation mark after the character string\' )\'.' 错误

java - 将时间戳从远程sql服务器获取到本地mysql的数据上

mysql - SQL - 遍历 MySQL 中的每一行表?

MYSQL:存储过程未正确执行带有 'IN' 子句的查询

mysql - mysql中的存储过程和触发器

mysql - 为什么查询不使用索引以及如何优化它?

sql - 生成多个UPDATE语句并执行它们

python - 使用重复索引递增 Numpy 数组