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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

3回答

3292閲覧

SQL ServerのSELECT実行速度

sha

総合スコア141

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2017/12/01 04:17

現在1700万件ほどのデータから日付を条件として抽出をしようとしています。

sql

1SELECT id, date1, date2, name FROM Table WHERE date1 = '2017-11-11';

date1はsmalldatetime NULL です。

実行すると30秒ほどかかってしまいますが
早くするために何か良い方法はあるのでしょうか?

date2はdate NULL なのですが、こちらを条件にすると1秒ほどで実行完了します。

Windows Server 2008
SQL Server 11
です。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

1700万件中、何件がヒットするのでしょうか?
ネットワーク越しの結果でしょうか?
サーバ上での結果でしょうか?

例えば1700万件中1000万件が対象で、ネットワーク越しに実行したら、結果の転送速度だけで時間がかかりそうな気がします。

同じ環境で次のようにしても遅いのでしょうか。

SQL

1SELECT count(id) name FROM Table WHERE date1 = '2017-11-11';

投稿2017/12/01 04:45

ttyp03

総合スコア16998

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

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

sha

2017/12/01 05:04

実行はサーバー上のSQLManagementStudioで行っています。 結果は30万件ほどです。 count(id)で件数のみ取得だと15秒程度でした。
ttyp03

2017/12/01 05:10

とすると、単純に検索が遅いようですね。 maisumakunさん指摘のインデックスでも効果がないとなると、カラムの型が影響しているのでしょうか。 http://d.hatena.ne.jp/matu_tak/20100123/1264361236 ここを見ると、smalldatetime型は4バイトで分単位、date型は3バイトで日単位です。 日付だけを条件にしているので、分単位の変換・比較が内部的に行われていて遅くなっているとか。 型はdate型にすることはできないのでしょうか?
sha

2017/12/03 00:52

コメントありがとうございます。 仕様を確認して型の変更が可能であれば変更してみます。
ttyp03

2017/12/03 04:15

型の変更が効果あるかはわからないので、テスト環境で試した後、有効であれば採用してください。
guest

0

おそらく、date1にインデックスが付いていない状態かと思います。

一致検索する列にインデックスがなければ、全件調べる以外の手段がないのに対して、インデックスがあればそこだけ調べれば済むので、劇的に速度が違います。

投稿2017/12/01 04:30

maisumakun

総合スコア145184

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

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

sha

2017/12/01 04:38

ご回答ありがとうございます。 date2は確かにインデックスが作成されていました。 date1も同じようにインデックス(NONCLUSTER)を作成しましたが 実行速度は変わりませんでした。
guest

0

ベストアンサー

まず実行プランを確認してください。
新しく張ったインデックスを使ってないようでしたら

SQL

1SELECT id, date1, date2, name 2FROM Table 3WHERE date1 = '2017-11-11' 4WITH (INDEX(IX_date1))

で使うインデックスを強要することが出来ます。

投稿2017/12/02 10:11

hihijiji

総合スコア4150

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

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

sha

2017/12/03 00:53

回答ありがとうございます。 WITH (INDEX())の構文は知りませんでした。試してみます。
sha

2017/12/08 08:50

クエリの推定実行プランを確認して不足されているインデックスを作成することでパフォーマンスが向上しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問