その右のパターンのためのユニークなデータベースにカラム?

StackOverflow https://stackoverflow.com/questions/463421

  •  19-08-2019
  •  | 
  •  

質問

私はテーブルの[ファイル]は、以下のようなスキーマ

CREATE TABLE [dbo].[File]
(
    [FileID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](256) NOT NULL,
 CONSTRAINT [PK_File] PRIMARY KEY CLUSTERED 
(
    [FileID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

あまり出現しないと考えるFileIDとして用いるキーのテーブルの名前は、完全修飾パスを表すファイルです。

んどろ風mikiモデルを作ってみたいですを保存手順チェックした場合、名前がすでに使用されている場合その利用記録の他の新規作成します。

しかしストレステストのコードで多くのスレッドの実行の手続きを一度に取得します異なる。

このバージョンのコードを作に行き詰まり、スローロの例外のクライアント

CREATE PROCEDURE [dbo].[File_Create]
    @Name varchar(256)
AS
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION xact_File_Create
    SET XACT_ABORT ON

    SET NOCOUNT ON 
    DECLARE @FileID int
    SELECT @FileID = [FileID] FROM [dbo].[File] WHERE [Name] = @Name
    IF @@ROWCOUNT=0
    BEGIN
        INSERT INTO [dbo].[File]([Name])
        VALUES (@Name)
        SELECT @FileID = [FileID] FROM [dbo].[File] WHERE [Name] = @Name
    END

    SELECT * FROM [dbo].[File]
    WHERE [FileID] = @FileID

    COMMIT TRANSACTION xact_File_Create
GO

このバージョンのコードで終わって行と同じデータ名ます。

CREATE PROCEDURE [dbo].[File_Create]
    @Name varchar(256)
AS
    BEGIN TRANSACTION xact_File_Create

    SET NOCOUNT ON 
    DECLARE @FileID int
    SELECT @FileID = [FileID] FROM [dbo].[File] WHERE [Name] = @Name
    IF @@ROWCOUNT=0
    BEGIN
        INSERT INTO [dbo].[File]([Name])
        VALUES (@Name)
        SELECT @FileID = [FileID] FROM [dbo].[File] WHERE [Name] = @Name
    END

    SELECT * FROM [dbo].[File]
    WHERE [FileID] = @FileID

    COMMIT TRANSACTION xact_File_Create
GO

いかにこのアクションの種類は?これらは一般的に、パターンをお使いのカラムデータの特徴は、単列または複数の列は、別のカラムを使用しています。

感謝

役に立ちましたか?

解決

ます多くのフィールド名フィールドでまうので物価連動となった集積場合には、 検索します。として使わないの@FileIDから最初に選んだけselect count(*)からのファイルの名前=@名の場合はゼロより大きます(予防からSQL固定のロックのテーブルから検索段階としないカラムを選択したものに限ります。)

きのコースの直列化可能でないレベルの行動に影響を及ぼその後のクエリで成功-失敗の名前とつだと感じています。その理由になる要因を複製することを選択した同時に見つかりませんでした記録、そうした先に挿入します(作成、複製).

の行き詰まりの前バージョンが不足による指標の検索処理に長い時間がかかる。読み込んだ場合はサーバーに直列化可能な取引では、他のすべてにおいて、操作を完了します。指数 すべ の操作を高速で検査を示す場合はしていない商品については十分です。合に応じて利用することができるのに失敗した取引によるresubmitting:実世界状況のように負荷が一過性です

編集:によるテーブル索引で使用しない直列化可能ま件

  • 名前が見つかったら、IDを捕獲します。 共通
  • 名前が見つからないとして挿入します。 共通
  • 名前が見つからないの挿入に失敗したので別の完全一致掲載されたミリ秒単位での初めてとなります。 非常に珍しい

私は期待この最後となる場合当プロジェクトは、日本と同時に、例外を捕捉この非常に珍しい場合が好ましい国の直列化は、深刻な性能の結果をもたらす。

だって、期待することを共通してい投稿内のミリ秒単位のものと同じ 新しい 名前を使用し、直列化可能な取引に伴い指数です。で遅くなることは、一般の場合、時間が高速化ユーザーからの投稿が見られます。

他のヒント

最初に、名前列に一意のインデックスを作成します。次に、クライアントコードから、FileIDを選択してNameをwhere句に入れて、Nameが存在するかどうかを最初に確認します。存在する場合は、FileIDを使用します。そうでない場合は、新しいものを挿入します。

Exists関数を使用すると、物事が少しきれいになる場合があります。

if (Exists(select * from table_name where column_name = @param)
begin
  //use existing file name
end
else
  //use new file name
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top