sql >> データベース >  >> RDS >> Sqlserver

SQLServerでテストデータを生成する方法

    アプリケーションの機能、特定のストアドプロシージャのパフォーマンス、または開発環境でのアドホッククエリをテストする場合は、本番データベースに保存されているデータと同様のデータを開発データベースに保存する必要があります。これは、50レコードを処理しているクエリのパフォーマンスが、5,000万行を処理している同じクエリのパフォーマンスとは異なるためです。テスト目的で本番データベースのコピーを開発データベースサーバーに復元することは、これらのデータベースに保存されている重要なデータのため、常に有効なオプションであるとは限りません。アプリケーションであり、本番データベースはまだありません。

    最良かつ最も安全な代替手段は、開発データベーステーブルにテストデータを入力することです。テストデータの生成は、本番データを変更せずに、アプリケーションのパフォーマンスや新機能をテストするのに役立ちます。すべてのシナリオに適合するテストデータを生成する単一の簡単な方法はありません。特に、テストケースのすべての可能な組み合わせをカバーする必要がある複雑なクエリとトランザクションのパフォーマンスをテストするために大量のデータを生成する必要がある場合はそうです。

    テーブルに大量のデータを入力する最も簡単な方法は、必要な数の重複を含む同一のレコードをデータベーステーブルに挿入し続ける単純なスクリプトを作成することです。ただし、問題は、SQL Serverクエリオプティマイザーが、データ分散の違いにより、本番データベースで構築されたものとは異なる計画を開発データベースで構築することです。たとえば、以下のスクリプトは、GO番号を使用してStudentsテーブルに100Kの冗長なテストレコードを入力します。 ステートメント:

    INSERT INTO Students (FirstName, LastName, BirthDate, STDAddress) VALUES ('John','Horold','2005-10-01','London, St15')
    
    GO 25000
    
    INSERT INTO Students (FirstName, LastName, BirthDate, STDAddress) VALUES ('Mike','Zikle','2005-06-08','London, St18')
    
    GO 25000
    
    INSERT INTO Students (FirstName, LastName, BirthDate, STDAddress) VALUES ('Faruk','Cedrik','2005-03-15','London, St24')
    
    GO 25000
    
    INSERT INTO Students (FirstName, LastName, BirthDate, STDAddress) VALUES ('Faisal','Ali','2005-12-05','London, St41')
    
    GO 25000

    別のオプションは、各列のデータ型に応じてランダムデータを生成することです。 IDENTITYプロパティを持つID列は、ユーザー側でコーディングを行うことなく、シーケンス番号を自動的に生成します。ただし、生徒の成績をランダムに生成する場合は、 RAND()を利用できます。 T-SQL関数を使用して、結果を必要な数値データ型としてキャストします。たとえば、次のスクリプトは、3つの異なるデータ型(INTEGERグレード、REALグレード、およびDECIMALグレード)を使用して、1〜100の学生に対して100Kのランダムな成績を生成します。これらの値の範囲は、数学およびプログラミングのスキルに応じて制御できます。 、以下に示すように:

    INSERT INTO StudentsGrades (STDGrade) VALUES (CAST(RAND(CHECKSUM(NEWID()))*100 as int)) AS INT_Grage
    
    GO 100000
    
    INSERT INTO StudentsGrades (STDGrade) VALUES (CAST(RAND(CHECKSUM(NEWID()))*100 as real)) AS Real_Grage
    
    GO 100000
    
    INSERT INTO StudentsGrades (STDGrade) VALUES (CAST(RAND(CHECKSUM(NEWID()))*100 as decimal(6,2))) AS Decimal_Grage
    
    GO 100000

    ランダムな名前の生成は、AdventureWorksおよびNorthwindMicrosoftテストデータベースを使用して実現することもできます。 。これらのデータベースをMicrosoftWebサイトからダウンロードし、これらのデータベースをSQL Serverインスタンスに接続し、これらのデータベースに格納されているデータを利用して、開発データベースにランダムな名前を生成する必要があります。たとえば、AdventureworksDW2016CTP3データベースのDimCustomerテーブルには、使用できる約18Kの名、ミドルネーム、および姓が含まれています。 CROSS JOINステートメントを使用して、18K値を超えるこれらの名前の組み合わせを多数生成することもできます。次のスクリプトを使用して、100Kの名と名前を生成できます。

    INSERT INTO StudentsGrades (First_Name, Last_Name)
    
    SELECT TOP 100000 N.[FirstName],cN.[LastName]
    
    FROM AdventureworksDW2016CTP3.[dbo].[DimCustomer] N
    
    CROSS JOIN AdventureworksDW2016CTP3.[dbo].[DimCustomer] cN
    >

    ランダムな電子メールアドレスと日付は、Microsoftのテストデータベースから生成することもできます。たとえば、同じDimCustomerテーブルのBirthDate列とEmailAddress列は、ランダムな日付と電子メールアドレスを提供できます。以下のスクリプトを使用して、生年月日と電子メールアドレスの10万の組み合わせを生成できます。

    INSERT INTO StudentsGrades (BirthDate, EmailAddress)
    
    SELECT TOP 100000 N.BirthDate,cN.EmailAddress
    
    FROM AdventureworksDW2016CTP3.[dbo].[DimCustomer] N
    
    CROSS JOIN AdventureworksDW2016CTP3.[dbo].[DimCustomer] c

    Country列のランダムな値は、AdventureWorks2016CTP3テストデータベースのPerson.CountryRegionテーブルを使用して生成することもできます。それはあなたがあなたの開発データベースで利益を得ることができる200以上の国の名前とコードをあなたに提供することができます。たとえば、次のスクリプトのように、国名とコードをマッピングするためのルックアップテーブルとして使用できます。

    INSERT INTO MappedConutries (CountryRegionCode, Name)
    
    SELECT [CountryRegionCode],[Name]
    
    FROM [AdventureWorks2016CTP3].[Person].[CountryRegion]
    
    Then insert a random name or country code from these countries that has ID equal to a random ID generated between 1 and 238, as the script below:
    
    INSERT INTO StudentsGrades (Country_Name) values
    
    ( (SELECT NAME FROM MappedConutries WHERE ID=CAST(RAND(CHECKSUM(NEWID()))*238 as int)))
    
    GO 10000
    >

    ランダムなアドレス値を生成するには、Personに保存されているデータを利用できます。 AdventureWorks2016CTP3テストデータベースのアドレステーブル。前の例で行ったのと同じように、開発データベースで簡単に使用でき、これらの値からランダムな組み合わせを取得できる、19Kを超える異なるアドレスとその空間位置が含まれています。次のスクリプトを使用すると、Person.Addressテーブルからランダムな100Kアドレスを簡単に生成できます。

    INSERT INTO StudentsGrades (STD_Address) values
    
    ( (SELECT NAME FROM [AdventureWorks2016CTP3].[Person].[Address] WHERE [AddressID]=CAST(RAND(CHECKSUM(NEWID()))*19614 as int)))
    
    GO 100000

    特定のシステムユーザーのランダムなパスワードを生成するために、 CRYPT_GEN_RANDOMを利用できます。 T-SQL関数。この関数は、Crypto API(CAPI)によって生成された、指定されたバイト数の長さの暗号化されたランダムに生成された16進数を返します。その関数から返された値をVARCHARデータ型に変換して、以下のスクリプトのように、100Kのランダムパスワードを生成するより意味のあるパスワードを設定できます。

    INSERT INTO SystemUsers (User_Password) SELECT CONVERT(varchar(20), CRYPT_GEN_RANDOM(20))
    
    GO 100000

    開発データベーステーブルを埋めるためのテストデータの生成も、各データタイプのスクリプトを記述したり、サードパーティのツールを使用したりする時間を無駄にすることなく、簡単に実行できます。テストデータの生成に使用できるさまざまなツールが市場に出回っています。これらのすばらしいツールの1つは、SQLServer用のdbForgeデータジェネレーターです。 。これは、開発データベース用の意味のあるテストデータを高速で生成するための強力なGUIツールです。 dbForgeデータ生成ツールには、列インテリジェントなランダムデータをエミュレートできる適切な構成オプションを備えた200以上の事前定義されたデータジェネレーターが含まれています。このツールを使用すると、すでにデータが入力されているSQL Serverデータベースのデモデータを生成したり、独自のカスタムテストデータジェネレーターを作成したりすることもできます。 dbForge Data Generator for SQL Serverは、SQL Serverテーブルに実際のデータと同じように見える数百万行のサンプルデータを入力することにより、デモデータの生成に費やす時間と労力を節約できます。 dbForge Data Generator for SQL Serverは、Basic、Business、Health、IT、Location、Payment、Personのデータ型など、最も頻繁に使用されるデータ型をテーブルに入力するのに役立ちます。次の図は、このツールがいかに簡単に機能するかを示しています。

    dbForge Data Generator for SQL Serverツールをインストールしてそのツールを実行した後、以下に示すように、[接続]ウィンドウでターゲットサーバー名とデータベース名を指定する必要があります。

    [オプション]ウィンドウでは、以下に示すように、テーブルに挿入する行数と、生成されたテストデータ基準を制御するその他のさまざまなオプションを指定できます。

    テストデータの要件に合わせてオプションをカスタマイズした後、をクリックします。 ボタンをクリックすると、選択したデータベースの下にあるすべてのテーブルと列のリストを含む新しいウィンドウが表示され、質問が表示されます。以下に示すように、テストデータを入力するテーブルを選択します。

    データを入力する必要のあるテーブルを選択するだけで、ツールはウィンドウの下部にある[プレビュー]セクションに提案されたデータと、図のように簡単にカスタマイズできるそのテーブルの各列のカスタマイズ可能なオプションを自動的に提供します。以下:

    たとえば、前述のようにID列の値を生成するために使用できる組み込みのジェネレータデータ型から選択できます。

    または、以下のように、一意性、最小、最大、生成された値の増分など、そのID列値の特性をカスタマイズします。

    さらに、First_Name列は、男性または女性、あるいはこれら2つのタイプの組み合わせに制限できます。また、以下に示すように、その列内のNULLまたは空の値のパーセンテージを制御できます。

    以下に示すように、BirthDate列は、学生、ティーンエイジャー、成人、退職者など、これらの学生が分類されるカテゴリを指定することによっても制御できます。

    以下に示すように、Country列の値を生成するために使用できる完全に記述されたジェネレーターを指定することもできます。

    そして、次のように電子メールアドレス列の値を生成するために使用される方程式をカスタマイズします。

    カスタマイズ可能な方程式の複雑さに加えて、以下に示すように、パスワード列の値を生成します。

    そして最後に、この魔法のツールではなく、私の例では、以下のアドレス列の値を生成するために使用されるジェネレーターと方程式:

    このツアーの後、この魔法のツールがデータの生成とリアルタイムシナリオのシミュレーションにどのように役立つかを想像して、アプリケーションの機能をテストすることができます。インストールして、利用可能なすべての機能とオプションをお楽しみください。

    便利なツール:

    dbForge Data Generator for SQL Server –SQLServerデータベースの意味のあるテストデータを高速で生成するための強力なGUIツール。


    1. ServiceNowとOracleIdentityCloud Service(IDCS)の統合

    2. チェック制約で日付を使用する、Oracle

    3. R12.2環境のクローンを作成する方法

    4. SQLで列を一意にする方法は?