2012-03-13 13 views
7

私は98w行のデータを持っています。私がpub_timeでデータをソートしたいとき、興味のあるものが見つかりました。ここでソートされたタイムスタンプ日付の2つのsql

はSQLです:

select * 
from t_p_blog_article_info t 
order by t.pub_time desc 

それは19Sを要しました。

select * 
from t_p_blog_article_info t 
where t.pub_time > to_date('1900-01-01 01:00:00', 'yyyy-mm-dd hh24:mi:ss ') 
order by t.pub_time desc 

費用は0.2sです。

私は知りたいのですが、なぜですか?

+0

'pub_time'カラムにインデックスがありますか? – Ollie

+0

ちょうど推測ですが、t.pub_timeがNULLになる可能性はありますか? – markblandford

+1

あなたのwhere句は多くのレコードをフィルタリングしているようですが、なぜですか? 01.01.1900 – ntziolis

答えて

4

おそらくテーブルのpub_timeにインデックスがあります。

したがって、2番目のクエリでは、このインデックスを使用して、指定した日付以降の日付がNULL以外のレコードのみを返すことができますが、最初のクエリはテーブル全体をクエリする必要があります。

+0

はい私はpub_timeにインデックスを持っていますが、最初のクエリでインデックスを使用しないのはなぜですか? – sarowlwp

+0

適切に言えば、どちらのクエリも 'SELECT *'と*おそらく*両方がすべての行を返すので、テーブル全体をクエリする必要があります。 (少なくとも、2番目のクエリがより少ない行を返していれば、OPはこの質問をするだろうとは思っていません。) – ruakh

+0

@sarowlwp:インデックスにはヌル値が含まれていないので、 'pub_time'がヌル可能な場合(実際にはnullでない場合でも)、そのインデックスはWHERE句がレコードを除外しないクエリには不十分ですそれはヌルです。 – ruakh

0

さまざまな可能性があります。あなたはpub_timeに無効な/ヌルの日付を持つ大量の行を除外することができますが、これらのかなりの数に気づかない/言及しないことには疑いがあります。私の心に突き出す

3つのものがあります:

- あなたはインデックスまたはpub_timeを含む複合指数、およびあなたの句は異なるアクセス・パスの使用をトリガさに制約があり

- 最初のクエリを実行したときにオプティマイザで使用可能な統計はありませんでした。 2番目のクエリを実行すると、最初のクエリを実行したときに発生した情報キャッシングにより、より良いアクセスパスが選択されました。これは、最初のクエリをさらに2,3回実行し、パフォーマンスが大幅に向上しているかどうかを確認することで確認できます。

- オプティマイザは、最初の点と同様に、where句の意味だけに基づいてより良いアクセス・パスを選択することができます。恐らくnull /無効な値を処理する必要がないというヒントを与えるだけで、無効/ヌルのpub_timesを除外するための1つ以上のフル・テーブル・スキャンを避けることができます。

このようなことの理由を突き止めることは、すぐに実証的なベンチャーになりつつあります。私はあなたのプラットフォーム&バージョンを知らなくても、もっと言い表すのは難しいです。タグから私はあなたがオラクルを使用しているとします。その場合、何が起こっているのかをよりよく理解するために、「説明のクエリー」または「プランを説明する」ツールを使用できる必要があります。オラクルオプティマイザの詳細については、http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htmを参照してください(これはOracle 9i v9.2用ですが、バージョンに依存しない概念についてはまともな説明があります)。

関連する問題