2011-02-01 4 views
1

選択できるSQLクエリを作成して、1000行を1列で並べ替えた後、100行だけを返す必要があります。n行を選択してm行を返すことができるSQLクエリ

なぜですか?私のクエリは〜1 000 000行(またはそれ以上)を選択することができ、私は最初に1000を取って、この1000行から最も関連性の高いものを100だけ表示します。私はそのような選択のパフォーマンスを恐れているので、この最初のステップを紹介したいと思います(わずか1000行しかかかりません)。より関連性の高い文書を見逃す可能性があることはわかっていますが、この場合は問題になりません。

+1

指定した順序で最初の1000行を選択し、その結果の最初の100行を*異なる*順序で返すクエリを要求していますか? –

+1

どのDBMSを使用していますか? – RichardTheKiwi

+0

@ Cyber​​kiwi私はMS Sqlを使用します。 @AdamRobinson。いいえ、私は1000行の順序を選択して100行を返したいと思います。 – Darqer

答えて

2

文字通りの解釈は

select top 1000 from tbl order by columnname 

そして

SELECT TOP 100 FROM (select top 1000 from tbl order by columnname) SQ 

に次のステップにつながるしかし、それはあなたが2つの異なるした後でない限り、直接

select top 100 from tbl order by columnname 

よりも異なって与えていません注文

SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname) SQ 
ORDER BY othercolumn 

または

ASC/DESCの間
SELECT TOP 100 
FROM (
    select top 1000 from tbl 
    order by columnname ASC) SQ 
ORDER BY columnname DESC 
5

最初の1000を選択しないと問題はありますか?すなわち、あなただけを使用する場合...

Select top 100 * 
From table 
Order by column 

あなたは同じ結果を取得し、他の場所で指摘したように、あなたはパフォーマンスを低下させるのではなく、それを改善する可能性がありません。

このクエリを最適化する場合は、columnにインデックスがあることを確認すると、SQL Serverはレコードの取得と並べ替えを最適化して、必要なものだけを提供できます。

+0

DBエンジンはとてもスマートなので、自動的にこのクエリを最適化しますか? – Darqer

+0

@ダーカー:1000の目的は何ですか? –

+0

質問した内容を正確に返すには、DBエンジンがスマートでなければならないのはなぜですか?特別な最適化は必要ありません。 – JohnFx

1

サブクエリを使用できます。何かのように:

select top 100 * from (
    select * from tablename 
    limit 1000 
) 
order by fieldname 

私のSQLはとても構文は少し外れかもしれない、とあなたが作業しているプラ​​ットフォームに応じて、それを行うには良い方法があるかもしれません少し錆びですが、うまくいけば、このことができます。

+0

このクエリは、フィールド名でTableNameの順序からトップ100を選択して、実際には何のメリットもありません。 – JohnFx

+0

@ JohnFx:元の1000レコードを選択するためにOPにいくつかの他の基準があると仮定していましたが、サブクエリに 'where'句を追加します。おそらくより明示的であったはずです。 –

+0

それでも、出力に何の違いもありません。 – JohnFx

4

を切り替え、私は私が最終的にあなたがで取得しようとしているのか理解だと思うが、あなたがデータベースが操作を注文実行方法については非常に混乱している表示されます。

私が正しく理解していれば、大量の行(例では1,000行ですが、多数の行ではありません)を並べ替えることによるパフォーマンスへの影響が懸念されます。したがって、あなたが興味を持っている100行をソートするだけで、それを圧倒しようとしています。

where句を100行に制限すると、ほとんどの場合、最新のDBシステムは自動的に余分な作業をしないように結果が絞り込まれるまでソートします。これは時間の100%ではありませんが、DBオプティマイザが最初にソートすることを決定した場合、パフォーマンスに基づいて非常に良い理由があるか、または問合せによって、ソートを最初に実行して正確な結果。

トリックは、tSQLが手続き型ではない宣言的な言語であることを理解しておかなければならないということです。つまり、言語を使用して必要なものを記述し、オプティマイザは、それを実現するための正確なアルゴリズムを見つけます。 C#やJavaのような手続き型言語を書くのと同じようにコードを最適化しようとしているようです。 SQLはクエリをコードに変換しますが、入力すると実行されません。

DBエンジンは、このタイプの単純な最適化(および非常に複雑なもの)が非常に優れています。このようなギミックでオプティマイザを最適化するつもりはないので、気にしないでください。パフォーマンスを向上させるつもりはなく、クエリの書き方によっては実際にパフォーマンスを低下させる可能性があります。