- PR -

SQLServerでの行範囲指定データ取得

1
投稿者投稿内容
まー
会議室デビュー日: 2004/09/24
投稿数: 14
投稿日時: 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

そこで他に何か良い方法があればご教授をお願い致します。
FallenSun
会議室デビュー日: 2004/11/25
投稿数: 10
投稿日時: 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/09/24
投稿数: 14
投稿日時: 2004-11-26 19:46
FallenSunさん、ご回答ありがとうございます。

返答が遅れてすみません。
参考になりました。
実際に試してみました。

(SELECT TOP 100 PERCENT * FROM [TABLE] ORDER BY [COLUMN])
のサブクエリ部分は結局全体を取ってこないといけないんですよね。

SELECT INTO使う方法とTOP句を駆使する方法だとどちらが
パフォーマンスがいいのか悩みますね。

FallenSun
会議室デビュー日: 2004/11/25
投稿数: 10
投稿日時: 2004-11-27 00:35
純粋にパフォーマンスを比較したら、きっとTOPを使う方が良い結果になるでしょうね。
SELECT INTOが優れているのは「検索条件とパフォーマンスの関係が直感に合っている。」という点だと思っています。

どちらが顧客満足度の高いソリューションになるかはケースバイケースでしょうね。^^;)
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 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/09/24
投稿数: 14
投稿日時: 2004-11-29 16:37
FallenSunさん、かつのりさんご回答ありがとうございます。

サーバーのメモリを圧迫しないことを考えるとやはり
TOP句を使用するほうが良さそうですね。

非常に参考になりました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)