質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

4919閲覧

SQL Server2008 R2でクエリータイムアウトが発生

yas0703

総合スコア7

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/21 01:20

###現象
主キーとインデックス(7個)を設定しています。

DBのデータは、週に1回20万件程度の登録を行って、
1年程度稼動しています。(1200万件程度)

Excelマクロで、ADODBを使って、1日1回データ集計を行っていますが、
週に1回程度、クエリータイムアウトが発生します。

エラーが発生するのは、Excelマクロが起動して最初に発行する
Select文でエラーとなっています。
クエリーに問題があるように見えず、対処方法に悩んでます。

###環境
OS:Windows Server 2008
DB:SQL Server 2008 R2
Excel:Excel2010

###エラーとなるソースコード
SELECT MAX(日付のカラム) FROM CHIPREPLY
WHERE DATATYPE='データタイプ' AND PERIOD = '年月' AND POINT = 'データ登録日'

adors.Open sql, adoCon, adOpenForwardOnly

###試したこと
クエリータイムアウトを180秒に設定することで一時改善できましたが、
レコード件数が増えているせいか、現状は週1回程度現象が発生しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

実際に実行計画を見ないと確証はありませんが、
こちらのQAによるとMAXもTOPもパフォーマンス的差異はないか、
むしろインデックスが定義されていないケースではTOPの方が実行速度が落ちる可能性もあります。
比較検証しているサイトがあったので参考までに。

ですので根本的に改善すべきはインデックスの設定となりそうです。
(質問でおっしゃっている7つ設定したインデックスの中に重複があればすみません・・・)

提示していただいているSQLのみに焦点を当てると、

  • DATATYPE、PERIOD、POINTに対しての複合インデックスを付与
  • 日付のカラムに対してもインデックスを付与

この二つが可能ならば上記を実施するだけでパフォーマンス的にかなり有利となるように思います。

特にMAX、MINなどの極値を得る集計関数は、
インデックスを定義しているとそれをそのまま利用してくれるため、
かなりコストを抑えることが可能です。
(インデックス自体が基本的にソート済のため)

以下は蛇足となります。
カラム数が多いテーブルならまだ良いのですが、
カラムはそこそこしかなくインデックスの数だけ増えてくると、
逆にパフォーマンスを損なうことになりますので注意して下さいね。

投稿2016/09/22 05:11

編集2016/09/22 05:16
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yas0703

2016/09/22 05:37

Panzer_vorさん、ありがとうございます。 社内と顧客の環境でTOPにかえたクエリーを投げたところ 応答速度はかなり早かったです。 明日から顧客の環境で、変更したモジュールで様子見となりました。 インデックスのつけ方も良くないかもしれないですね。 インデックスの見直しも含めて、再度見てみたいと思います。
Panzer_vor

2016/09/22 05:44

> yas0703さん なるほど、通説のように遅くなるという訳でもないのですね。 バージョンが新しくなって最適化とかも行われてるのかもしれませんね、勉強になりました。 やはり究極的に一番信用できるのは実行計画見ることしかないということですかね^^;
yas0703

2016/09/27 06:23

Panzer_vorさん、Topでやっても状況は変わらずでした。 あとは、インデックスの見直ししかないかと思います。 まだ、解決したわけではありませんが、ベストアンサーとさせていただきます。 ありがとうございました。
Panzer_vor

2016/09/27 09:21

> yas0703さん なるほど、状況は分かりました。 最終的には実行計画を見ながら判断が必要となると思いますので以下のコメントはあくまで目安として下さい。 インデックスの見直す上で下記の観点でそれぞれ確認してみてください。 ①WHERE句そのままでSELECT * でレコード取得し計測 ②WHERE句を外して日付カラムのMAXのみ取得し計測 ①の時点で時間がかかるなら複合インデックスの検討を、 ②で時間がかかるなら日付カラムへのインデックス付与がそれぞれ効果が大きいと思われます。
guest

0

MAX関数を使うとレコード数に比例して処理速度が遅くなってしまうので、TOPを使ってみてはどうでしょうか?
やっていることは同じことで、日付のカラムの降順でソートかけて、最初の1レコードだけを取得しています。

SQL

1SELECT TOP 1 日付のカラム FROM CHIPREPLY 2WHERE DATATYPE='データタイプ' AND PERIOD = '年月' AND POINT = 'データ登録日' 3ORDER BY 日付のカラム DESC 4

投稿2016/09/21 02:38

ijufumi

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yas0703

2016/09/21 03:24

ijufumiさん、ありがとうございます。 変更してみて、様子見てみたいと思います。
yas0703

2016/09/27 06:23

現地環境で確認して頂きましたが、TOPに変更しても状況変わらずでした。 インデックスの見直しが先決のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問