- - PR -
SQLServerでの行範囲指定データ取得
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-25 21:07
お世話になります。
SQLServerで、1001行目〜1010行目といったように 行範囲でデータを取得したいと考えています。 Oracleの場合ですとRownumを使用して取り出すことが 可能ですが、SQLServerですとTOPを使用して 取り出すようになるかと思います。 下記サイトを参考にすると、 TOPで取り出して行範囲でデータを取り出すことはできますが 取り出したい開始行が大きければ大きいほどパフォーマンスが 悪くなるかと思います。 http://www.sqlpassj.org/bunkakai/web/series/ado/04.aspx#l4_5 そこで他に何か良い方法があればご教授をお願い致します。 |
|
投稿日時: 2004-11-25 21:43
TOPを使わない方法としてこんなのはどうでしょう?
サブクエリ内のORDER BY句で取得したい並び順を指定してください。 (パフォーマンスを重視するのであれば一時テーブルのID列を主キーにすべきかも。) SELECT T1.*, IDENTITY(1, 1) AS [ID] INTO #T1 FROM (SELECT TOP 100 PERCENT * FROM [TABLE] ORDER BY [COLUMN]) AS T1 SELECT * FROM #T1 WHERE [ID] BETWEEN 1001 AND 1010 DROP TABLE #T1 |
|
投稿日時: 2004-11-26 19:46
FallenSunさん、ご回答ありがとうございます。
返答が遅れてすみません。 参考になりました。 実際に試してみました。 (SELECT TOP 100 PERCENT * FROM [TABLE] ORDER BY [COLUMN]) のサブクエリ部分は結局全体を取ってこないといけないんですよね。 SELECT INTO使う方法とTOP句を駆使する方法だとどちらが パフォーマンスがいいのか悩みますね。 |
|
投稿日時: 2004-11-27 00:35
純粋にパフォーマンスを比較したら、きっとTOPを使う方が良い結果になるでしょうね。
SELECT INTOが優れているのは「検索条件とパフォーマンスの関係が直感に合っている。」という点だと思っています。 どちらが顧客満足度の高いソリューションになるかはケースバイケースでしょうね。^^;) |
|
投稿日時: 2004-11-27 01:05
対象テーブルの主キーとidentity列を持つテーブルを用意して、
対象テーブルに対してインサートのトリガーを貼っておくというのはどうでしょうか? 元テーブル(t1) key1 key2 data ---- ---- ---- 0 1 0 0 2 10 トリガーでインサートするインデックス管理用テーブル(t2) key1 key2 id ---- ---- ---- 0 1 1 0 2 2 select * from t1 inner join t2 on t1.key1 = t2.key1 and t1.key2 = t2.key2 where t2.id between 1000 and 1010 既存のデータ分は用意する必要がありますが、 テーブルレイアウトの変更もなく、パフォーマンスも稼ぎやすいです。 |
|
投稿日時: 2004-11-29 16:37
FallenSunさん、かつのりさんご回答ありがとうございます。
サーバーのメモリを圧迫しないことを考えるとやはり TOP句を使用するほうが良さそうですね。 非常に参考になりました。 ありがとうございました。 |
1