ソートされたタイムスタンプ日付のための2つのSQL
-
13-12-2019 - |
質問
私は98Wの行データを持っています。PUB_TIMEでデータを並べ替えたいときは、興味のあることがわかりました。
これはSQL:
です。select *
from t_p_blog_article_info t
order by t.pub_time desc
.
それは19秒かかります。
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のコストです。
私は知りたいのですが、なぜ?
解決
あなたはおそらくあなたのテーブルのpub_timeにインデックスを持っています。
そのため、2番目のクエリは、指定された日付以降、NULL以外の日付を持つレコードのみを返すようにこのインデックスを使用して、最初のクエリはテーブル全体を問い合わせる必要があります。
他のヒント
の可能性があります。 PUB_TIMEで無効/ NULLの日付を持つ多数の行をフィルタリングすることができますが、あなたがこれらのもののかなりの数の数に気付く/述べることを疑います。
私の心に突き出ている3つのことは次のとおりです。
1 - pub_timeを含むインデックスまたはコンポジットインデックスを持ち、WHERE句の制限は別のアクセスパスの使用をトリガーしている
2 - あなたがあなたの最初のクエリを実行したときにオプティマイザの統計は利用できませんでした。 2番目のクエリを実行すると、最初のクエリを実行したときに発生した情報キャッシュのおかげで、より良いアクセスパスが選択されました。これは、最初のクエリをもう数回実行し、かなりのパフォーマンスが向上するかどうかを確認することで確認できます。
3 - 最初の点と同様に、オプティマイザは単にWHERE句の意味に基づいてより良いアクセスパスを選択することができます。おそらくNULL /無効な値を処理する必要がないヒントを与えるだけで十分です。システムは1つ以上の全テーブルスキャンが無効/ NULL pub_timesに除外されていてもらうことができます。
このようなものの理由を特定することは急速に経験的なベンチャーになりつつあります - あなたのプラットフォームとバージョンを知らずにもっと言うのは難しいです。タグから私はあなたがそれを使ってあなたがそれを使っています、その場合は、何らかの形の「Explain Query」または「Explain Plan」ツールを使用して、何が起こっているのかを理解することができるはずです。 Oracle Optimizerの詳細については、 http://docs.oracle .com / cd / b10500_01 / server.920 / a96533 / optimops.htm (これはOracle 9i v9.2用ですが、バージョンに依存しない概念のまともな説明があります)