私はエンタープライズライブラリのDALアプリケーションブロックを介してストアドプロシージャを呼び出し、自分のプロシージャでカスタムテーブルデータ型(@names
をNamesTable
)として「受信」したDataTableを渡します。この手順は2回目の呼び出しから非常に遅く、パフォーマンスを大幅に向上させるために、実装する方法が異なります。SQL Serverストアドプロシージャのパフォーマンスを向上させる方法?
Names/HistoricalNamesテーブルは膨大で(1億レコード)、これらのテーブルに(データセット/テーブルパラメータを介して)渡されるデータは約400万レコードです)。
基本的には(行う必要がある)ないものを以下の通りです:
Names
またはHistoricalNames
いずれかの場合-
- チェックのDataTable /テーブルパラメータであるインポート
@names
(テーブルには、新しいデータセット/テーブルパラメータに含まれる名前のいずれかが含まれています()。インポート全体をスキップして戻る2 @names
のすべてのレコードをNames
に挿入し、1を返します。
- チェックのDataTable /テーブルパラメータであるインポート
表には、次のようになります。
create table NameTable
(
name nvarchar(20)
otherId uniqueidentifier
)
これが手順です:
create table Names
(
id int IDENTITY(1,1) NOT NULL,
name nvarchar(20),
otherId uniqueidentifier
)
create table HistoricalNames
(
id int IDENTITY(1,1) NOT NULL,
name nvarchar(20),
otherId uniqueidentifier
)
表値のパラメータ(@names
)は次のようになります。
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_ImportNames]
@names NameTable READONLY
AS
BEGIN
IF ((SELECT COUNT(cd.name) FROM Names as cd WHERE cd.name IN (SELECT c.name FROM @names as c)) > 0)
BEGIN
SELECT 2;
END
ELSE IF ((SELECT COUNT(cd.name) FROM HistoricalNames as cd WHERE cd.name IN (SELECT c.name FROM @names as c)) > 0)
BEGIN
SELECT 2;
END
ELSE
BEGIN
INSERT INTO Names (name, otherId) SELECT * FROM @names;
SELECT 1;
END
END
GO
パフォーマンスを簡単に調整できますか?どんな助けでも大歓迎です!
これらのテーブルにはどのようなインデックスがありますか? –
スポットがあります。私たちは 'name'カラムにインデックスを持っていましたが、これらは自動的に"スクリプト作成 "には取り込まれませんでした。 – ReFocus
' id'カラムに主キーをクラスター化しましたか? –