2

1000 を超えるレコードを返すストアド プロシージャが 1 つあります。

検索テーブルの列に一時的な非クラスター インデックスを作成したいのは、非クラスター インデックスがデータ取得 (SELECT) 操作を高速化し、データ更新 (UPDATE および DELETE) 操作を遅くし、後でその非クラスター インデックスを削除すると聞いたからです。操作が完了しました。

UserDetails と CategoryMaster の 2 つのテーブルと検索フィールドがあるように:

  • UserDetails (サービスの説明、スキル)
  • カテゴリーマスター(名前)

これは私のストアドプロシージャです:

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]

ストアド プロシージャで一時的な非クラスター インデックスを作成し、選択操作の後にその非クラスター インデックスを削除することは可能ですか????

4

1 に答える 1

2

一時インデックスは悪い考えです。テーブルにインデックスを付けるには、テーブルをスキャンする必要があります。これは、現在のセットアップでテーブルに対して SELECT を実行する場合と同様です。

検索条件の先頭にワイルドカードがあるため、言及したフィールドの永続的な (および一時的な) インデックスはまったく効果がありません。とにかく、これはテーブルスキャンになります。

インデックスが役立つ唯一の場所は、結合で使用される外部キー列です。ただし、テーブルに関して意味のあるサイジング統計がなくても、それは推測です。

于 2014-12-09T13:50:49.297 に答える