MS SQL 2008、マージナルノート。 たくさんの乱数

多くの問題を解決するには、たとえば、アプリケーションの脆弱性をテストするなど、事前に定義された情報を含むこのような行を多数挿入する必要があります。 主な問題は、データ作成アルゴリズムではなく、非常に多くの行を作成できるメカニズムです。



トピックに興味のある方、猫の下で歓迎...



問題 :MS SQL 2008では、1から100,000までの10,000,000(千万)のランダムプライムをテーブルに追加します。

タスクの単純さには、創造性のための大きな分野があります。



解決策1

最も簡単な方法:ループを編成し、各反復でテーブルに乱数を追加します。

解決策は独創的ではなく、シンプルで...非常に長く、本当に非常に長い...





T-SQL



私のマシン(CPU:AMD Phenom II X2 550 / RAM:8Gb / HDD:WD5000AAKS / MS SQL2008R2 / Win7x64)では、実行時間が25分を超えると、要求を中断する必要がありました。



解決策2

前のソリューションの最も弱い点は、反復の数が追加された行の数に等しいことです。



少し考えてグーグルを調べてみると、興味深いテーブルマスター..spt_valuesが見つかりました (アトムのようにMS SQLが不足することはありません)。



要求を書き換えます。

一度に1つのレコードではなく、一度に2000レコードを挿入します。

このソリューションは以前のものと大差ありませんが、生産性が大幅に向上します。





T-SQL



クエリに48秒かかりました。

(ソリューションが2,000倍高速だったと仮定しますが、以前のソリューションは完了するまでに26時間以上かかります)。



解決策3

それでも生産性を向上できますか?

スクリプトWHILEを見てみましょう。

それを取り除くために、できるだけ多くの数を含むテーブルが必要です-理想的には10,000,000に等しいです。



Google Swarmは「CROSS JOIN」と「WITH」です。



素数の表が必要です:







そこから必要な数字のセットを含むテーブルを作成します:







そして最後に結果を追加します







要求は34秒未満で完了しました。

T-SQL



どのソリューションを選択しますか?

もちろん、額にソリューションを使用していません。 つまり、決定1では、「どうしたらいいか」というストーリーを安全に伝えることができます。



ソリューション2とソリューション3の違いはそれほど明白ではありません。 シンプルさと速度。 どちらを使用するかは、特定の状況と、将来保守および拡張が容易になるものによって異なります。



ソースコード



All Articles