0

SMOを使用すると、パフォーマンスの大きな問題が発生します。すべてのデータベースオブジェクト(関数、ユーザー、ロール、テーブルなど)をスクリプト化し、テーブルを除くすべてのデータベースオブジェクトをスクリプト化すると、2分もかかりませんが、テーブルスクリプトを有効にすると2時間かかりますか?したがって、次を使用してすべてのテーブルプロパティをロードします。

   serverSQL.SetDefaultInitFields(typeof(SMO.Table), true);

SMOのパフォーマンスを向上させるためですが、効果がないようです。ここに私のコード:

public static string dumpTables(SMO.TableCollection tables)
        {
            int cpt = 0;
            SMO.ScriptingOptions scriptingOptions = new SMO.ScriptingOptions();
            StringBuilder sb = new StringBuilder();
            scriptingOptions.IncludeIfNotExists = true;
            scriptingOptions.DriAll = true;
            scriptingOptions.ExtendedProperties = true;  

            foreach (SMO.Table table in tables)
            {
                sb.Append("-- Table " + table.Name + "\n");

                foreach (string scriptline in table.Script(scriptingOptions)) //Script call take a long time
                {
                    sb.Append(scriptline + Environment.NewLine );
                }
                sb.Append("GO" + Environment.NewLine);
                cpt++;
                Console.WriteLine(string.Format("Table {0} : {1}", cpt.ToString(), table.ToString()));
            }
            return sb.ToString();
        }

最後の問題は、SQLスクリプトを使用してテーブルスクリプトを直接作成することですが、SSMSを使用すると、数分でテーブルスクリプトを作成できます(SSMSスクリプトウィザードはSMOまたはSQLスクリプトを使用しますか?) 。

4

2 に答える 2

0

上記のGertArnoldのコメントをリフすると、これでうまくいくはずです。

public static string dumpTables(SMO.TableCollection tables)
        {
            SMO.ScriptingOptions scriptingOptions = new SMO.ScriptingOptions();
            scriptingOptions.IncludeIfNotExists = true;
            scriptingOptions.DriAll = true;
            scriptingOptions.ExtendedProperties = true;

            SMO.Scripter scripter = new SMO.Scripter();
            scripter.Options = scriptingOptions;

            return scripter.Script(tables);
        }

警告:私はC#プログラマー(単なるDBA)ではありませんが、Scripter.Script()メソッドはSqlSmoObject []を受け取ることができます。これは、基本的に、上記のコメントのリンクがパフォーマンスを向上させるために行うことです。

于 2012-08-26T21:45:22.893 に答える
0

多くの回避策があります。SMO.Tableごとにすべてのスクリプトを1つずつログに記録した後、一部のスクリプトは1秒未満で、他のスクリプトは約50秒かかることがわかりました。

  1. したがって、最初の回避策はマルチスレッドを使用することです。そうすることで、2時間かかったスクリプトを20分だけ600%速くすることができます。最高のパフォーマンスを実現できるスレッドの数をテストする際に最適化せずに、基本的なThreadPoolを試してみました。後で言います。(最高のパフォーマンスを向上させるコンピューターのスレッド数を確認するために、さまざまな数のスレッドを使用してテストし、ログに記録します)

  2. もう1つの回避策は、コードプレックスでDBDiffを使用することです。このソースを使用すると、SMOを使用せずにスクリプトを高速化できますが、コードを少なくしたい場合は役に立ちません(手動でスクリプトを作成します;-)。クラスを使用してSQLスクリプトを作成する必要がありますが、このツールはデータベースを同期するのに非常に優れています;-)

于 2012-08-27T19:08:50.993 に答える