none
C#などのプログラムから接続中のDBを最適化する方法について RRS feed

  • 質問

  • SQLServerの最適化(パフォーマンスを上げる方法)について質問させてください。

    当方、SQLServerを含めDBの初心者なので、見当はずれな質問をしているかもしれませんが、

    接続中のDBに対し、C#などで作成したプログラム中から最適化する方法をご教示ください。

    質問内容は以下です。

    C#などのプログラムング言語で作成したソフトからSQLServerに常時接続するプログラクを

    作成しております。

    質問①:常時接続状態で、接続中のDBをプログラム中から最適化することはできるのでしょうか?

    質問②:プログラム中から行えない場合、外部から接続中のDBに対し最適化を行う方法はあるのでしょうか?

    質問③:SQLServerの機能で自動的に最適化を上げる機能は存在するのでしょうか?

    現在、自分でも調査をしていますが、何かヒントになればと思いご質問させていただき増した。

    以上、宜しくお願い致します。

    2016年1月7日 8:00

回答

  • 質問者さんのいう「SQLServerの最適化」に具体性がありません。
    データベースには曖昧な最適化というものはありません。すべての処理にはそれぞれに要するコストがあり、パフォーマンスカウンターやプロファイラー、実行プランなどで確認することができます。その上で、コストのかかっている部分を改善するのが最適化です。

    このような質問のされ方ですと、C#プログラム側で呼び出しているクエリーについてそれら分析と改善が行われていないことが予想されます。例えばテーブルやインデックスには断片化率が存在し、断片化を解消する機能もありますが、その前に断片化を引き起こさないクエリーを検討すべきです。
    もしくは分析を行った結果、ディスクI/Oに要していることが判明し、削減する改善を行ったものの不十分ということであれば、質問内容は自ずと変わってきて今回のような曖昧な質問にはならないはずです。

    というわけで、闇雲に最適化を行のではなく、分析を行うことをお勧めします。

    • 回答としてマーク A.OBO 2016年1月8日 7:30
    2016年1月7日 12:35
  • SqlConnectionで接続してSqlCommandでシステムプロシージャのsp_configureを実行して構成オプションを変えてやれば一応はできます。
    ディスクの圧縮であれば、同様にSqlCommandでAUTO_SHRINKをONにしてやれば自動圧縮してもらえます。

    ほかにはSqlServerManagement.Smoというアセンブリを使うことでもSqlServerの管理を行うことができて、ConfigurationDatabase.Shrinkで操作できます。

    #操作するためには権限が必要ですけどね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2016年1月7日 9:25
    • 回答としてマーク A.OBO 2016年1月8日 7:23
    2016年1月7日 9:23
  • 一般論ですが、SQL Serverの最適化(と言う言葉が正しいかどうかわかりませんが)はプログラムから行うのではなく、SQL Server Management Studioのメンテナンスプランで行うのが普通だと思います。このメンテナンスプランを、同じくSQL Server Management Studioのエージェントの機能を使って定期的に実行します。
    例えば、トランザクションログをバックアップしてトランザクションログを切り捨てたり、インデックスの再生成等を行います。
    ただし、無料版であるExpress EditionのSQL Server Management Studioには確かこの機能が無かったと思います。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク A.OBO 2016年1月8日 7:34
    2016年1月8日 1:15

すべての返信

  • SqlConnectionで接続してSqlCommandでシステムプロシージャのsp_configureを実行して構成オプションを変えてやれば一応はできます。
    ディスクの圧縮であれば、同様にSqlCommandでAUTO_SHRINKをONにしてやれば自動圧縮してもらえます。

    ほかにはSqlServerManagement.Smoというアセンブリを使うことでもSqlServerの管理を行うことができて、ConfigurationDatabase.Shrinkで操作できます。

    #操作するためには権限が必要ですけどね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2016年1月7日 9:25
    • 回答としてマーク A.OBO 2016年1月8日 7:23
    2016年1月7日 9:23
  • 質問者さんのいう「SQLServerの最適化」に具体性がありません。
    データベースには曖昧な最適化というものはありません。すべての処理にはそれぞれに要するコストがあり、パフォーマンスカウンターやプロファイラー、実行プランなどで確認することができます。その上で、コストのかかっている部分を改善するのが最適化です。

    このような質問のされ方ですと、C#プログラム側で呼び出しているクエリーについてそれら分析と改善が行われていないことが予想されます。例えばテーブルやインデックスには断片化率が存在し、断片化を解消する機能もありますが、その前に断片化を引き起こさないクエリーを検討すべきです。
    もしくは分析を行った結果、ディスクI/Oに要していることが判明し、削減する改善を行ったものの不十分ということであれば、質問内容は自ずと変わってきて今回のような曖昧な質問にはならないはずです。

    というわけで、闇雲に最適化を行のではなく、分析を行うことをお勧めします。

    • 回答としてマーク A.OBO 2016年1月8日 7:30
    2016年1月7日 12:35
  • 一般論ですが、SQL Serverの最適化(と言う言葉が正しいかどうかわかりませんが)はプログラムから行うのではなく、SQL Server Management Studioのメンテナンスプランで行うのが普通だと思います。このメンテナンスプランを、同じくSQL Server Management Studioのエージェントの機能を使って定期的に実行します。
    例えば、トランザクションログをバックアップしてトランザクションログを切り捨てたり、インデックスの再生成等を行います。
    ただし、無料版であるExpress EditionのSQL Server Management Studioには確かこの機能が無かったと思います。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク A.OBO 2016年1月8日 7:34
    2016年1月8日 1:15
  • 回答ありがとうございます。

    ご回答いただいた内容を基に実現方法を模索したいと思います。

    質問のも書きましたが、まだわからないことが多い初心者に質問にご回答いただきありがとうございました。

    2016年1月8日 7:23
  • ご指摘ありがとうございます。

    仰る通り分析ができていないですね。

    安易にパフォーマンスを改善をするには、佐祐理様のご回答にありましたように

    断片化を解消すればいいと考えておりました。

    今後、不明点があった場合、きちんとSQLServerについて勉強をしたうえで、

    質問をさせていただきます。

    その際は又、ご教示頂けるようお願い致します。

    2016年1月8日 7:30
  • ご回答ありがとうございます。

    そのような、やり方もあるのですね。

    色々な方にご回答、ご指摘いただきました感謝しています。

    今回ご回答いただいた内容も踏まえ、もっと勉強をしたいと思います。

    又、質問をすることがあると思いますが、その際は宜しくお願い致します。

    2016年1月8日 7:34