トップ回答者
C#などのプログラムから接続中のDBを最適化する方法について

質問
-
SQLServerの最適化(パフォーマンスを上げる方法)について質問させてください。
当方、SQLServerを含めDBの初心者なので、見当はずれな質問をしているかもしれませんが、
接続中のDBに対し、C#などで作成したプログラム中から最適化する方法をご教示ください。
質問内容は以下です。
C#などのプログラムング言語で作成したソフトからSQLServerに常時接続するプログラクを
作成しております。
質問①:常時接続状態で、接続中のDBをプログラム中から最適化することはできるのでしょうか?
質問②:プログラム中から行えない場合、外部から接続中のDBに対し最適化を行う方法はあるのでしょうか?
質問③:SQLServerの機能で自動的に最適化を上げる機能は存在するのでしょうか?
現在、自分でも調査をしていますが、何かヒントになればと思いご質問させていただき増した。
以上、宜しくお願い致します。
回答
-
質問者さんのいう「SQLServerの最適化」に具体性がありません。
データベースには曖昧な最適化というものはありません。すべての処理にはそれぞれに要するコストがあり、パフォーマンスカウンターやプロファイラー、実行プランなどで確認することができます。その上で、コストのかかっている部分を改善するのが最適化です。このような質問のされ方ですと、C#プログラム側で呼び出しているクエリーについてそれら分析と改善が行われていないことが予想されます。例えばテーブルやインデックスには断片化率が存在し、断片化を解消する機能もありますが、その前に断片化を引き起こさないクエリーを検討すべきです。
もしくは分析を行った結果、ディスクI/Oに要していることが判明し、削減する改善を行ったものの不十分ということであれば、質問内容は自ずと変わってきて今回のような曖昧な質問にはならないはずです。というわけで、闇雲に最適化を行のではなく、分析を行うことをお勧めします。
- 回答としてマーク A.OBO 2016年1月8日 7:30
-
SqlConnectionで接続してSqlCommandでシステムプロシージャのsp_configureを実行して構成オプションを変えてやれば一応はできます。
ディスクの圧縮であれば、同様にSqlCommandでAUTO_SHRINKをONにしてやれば自動圧縮してもらえます。ほかにはSqlServerManagement.Smoというアセンブリを使うことでもSqlServerの管理を行うことができて、ConfigurationやDatabase.Shrinkで操作できます。
#操作するためには権限が必要ですけどね
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
一般論ですが、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
すべての返信
-
SqlConnectionで接続してSqlCommandでシステムプロシージャのsp_configureを実行して構成オプションを変えてやれば一応はできます。
ディスクの圧縮であれば、同様にSqlCommandでAUTO_SHRINKをONにしてやれば自動圧縮してもらえます。ほかにはSqlServerManagement.Smoというアセンブリを使うことでもSqlServerの管理を行うことができて、ConfigurationやDatabase.Shrinkで操作できます。
#操作するためには権限が必要ですけどね
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
質問者さんのいう「SQLServerの最適化」に具体性がありません。
データベースには曖昧な最適化というものはありません。すべての処理にはそれぞれに要するコストがあり、パフォーマンスカウンターやプロファイラー、実行プランなどで確認することができます。その上で、コストのかかっている部分を改善するのが最適化です。このような質問のされ方ですと、C#プログラム側で呼び出しているクエリーについてそれら分析と改善が行われていないことが予想されます。例えばテーブルやインデックスには断片化率が存在し、断片化を解消する機能もありますが、その前に断片化を引き起こさないクエリーを検討すべきです。
もしくは分析を行った結果、ディスクI/Oに要していることが判明し、削減する改善を行ったものの不十分ということであれば、質問内容は自ずと変わってきて今回のような曖昧な質問にはならないはずです。というわけで、闇雲に最適化を行のではなく、分析を行うことをお勧めします。
- 回答としてマーク A.OBO 2016年1月8日 7:30
-
一般論ですが、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