アプリ版:「スタンプのみでお礼する」機能のリリースについて

データ数が数十万レコードのテーブルがあります。

ここから上位1000件のレコードをデータセットに取得したいと思います。
しかし、この時点でソートがかけられないのでビューを作成時にソート
をすることになると思います。

レコード数が少ない場合は、これでもいいのですが、多くなると、データ
セットに取得する時点でかなり時間がかかります。

この場合、どういった方法が最適でしょうか?

リーダーを使うのが普通でしょうか?

A 回答 (4件)

>最初は#2さんの回答のようにORDERを指定していましたが、それだと取得数(300)が取れなかったので、これは.NETの仕様かと思い、VIEWでORDERを指定しようと思いました。


もしかして.NET2005ですか?
件数の仕様は聞いた事がありませんが、2005はまだ触れてないので、正確にはわかりません。

私の.NET2002では普通に300件取れましたが、、、、
新規のプロジェクトを起こして、以下を実行したらどうなりますか?

Imports System.Data.OleDb
Module Module1
  Sub Main()
    Dim l_strPath As String = "C:\県ALL.mdb"
    Dim l_strSQL As String = ""
    l_strSQL &= "SELECT TOP 300 * FROM KEN_ALL" & vbCrLf
    l_strSQL &= "WHERE(F7 Like '%府%')" & vbCrLf
    l_strSQL &= "ORDER BY F5 ASC, ID ASC"

    Dim l_cnn As New OleDbConnection( _
              String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", l_strPath) _
          )
    Dim l_cmd As New OleDbCommand(l_strSQL, l_cnn)
    Dim l_adp As New OleDbDataAdapter(l_cmd)
    Dim l_dst As New DataSet()

    l_adp.Fill(l_dst)
    MsgBox(l_dst.Tables(0).Rows.Count)

  End Sub
End Module
    • good
    • 0
この回答へのお礼

ありがとうございます。

もらったサンプルではTOP値で指定したレコード数が表示
されました。

私の作っているのではほとんど意味のない値ばかり表示
されていた上に、買った本のサンプルでは、SORTはView
でしか実行されていなかったために勘違いしてしまいま
した。

もう一度、自分のソースをよく見直してみようと思いま
す。

なお、VB2005を使っています。

お礼日時:2006/04/20 23:45

>Dim l_dstマスタ As DataSet


>l_dstマスタ = データセット取得()
>この時点でしょうか


ん?


>上位1000件のレコードをデータセットに取得
>しかし、この時点でソートがかけられないのでビューを作成時にソート
と言われておりましたので、取得した後のデータセットをソートし、データセットに格納する方法を示したのです。

ですので最初の部分は、質問者さんの既存処理を表しております。



ちょっと整理しましょう。。。

>郵便番号データ(約12万件)
>12万件のDatasetを取得しないと

まず。。。
・データベースは何でしょう?「オラクル?SQLサーバ?アクセス?などなど」
・そのテーブル構成はどのようになっていますか。主にキーを知りたいです。
・既存のデータセットを取得するときの文と、「300件ずつ」表示するための編集条件と、表示するためのソート条件
これらを示していただけませんか?

この回答への補足

すみません。中途半端で。

データは次のところから全フィールドをインポートしています。
フィールド名は仮にF1、F2、F3・・・としておきます。
http://www.post.japanpost.jp/zipcode/dl/kogaki.h …

それの他にIDというオートナンバーのフィールドをもちそれが
主キーです。テーブル名はKEN_ALLで、DBはAccessのMDBです。

SQLは "SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%')"
という感じです。F7に都道府県名がはいっているとします。

最初は#2さんの回答のようにORDERを指定していましたが、
それだと取得数(300)が取れなかったので、これは.NETの
仕様かと思い、VIEWでORDERを指定しようと思いました。

"SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%')
ORDER BY F5 ASC, ID ASC"

oleDa = New OleDb.OleDbDataAdapter(SQL, oleCn)



DAO、ADO、DataReaderだとTOP値が生きてくるのですが・・・

補足日時:2006/04/20 09:49
    • good
    • 0

こんにちは。



データセットを取得する時にSQL文を発行して取得していれば、上位1000件をソートするSQL文を発行出来ればいいと思います。

SQL文は 昇順での並べ替えの場合
SELECT フィード名 FROM テーブル名 WHERE 抽出条件 ORDER BY フィールド名 ASC

降順はASCをDESCにします。
    • good
    • 0

早い/遅いは、


・現場の環境
・あなたが発行しているSQ
・テーブルのキー状態と、そのオブジェクト間の関連性
などなど、、、

全てを知らない限り、何も言えません。
それらのことは、質問をするより、
「現場で思いつくパターンの簡単なサンプルをテスト実行する」
というのが、普通だと思います。


データセットのソート方法は以下に記します。

------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'何らかの関数で、あらかじめデータセットは取得出来ているものとする
Dim l_dstマスタ As DataSet
l_dstマスタ = データセット取得()
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'ソートをして、データを抽出する(抽出条件 = Nothing/ソート条件のみ指定)
Dim l_drwデータロウズ As DataRow()
Dim l_strソート条件 As String = "カラム1 ASC, カラム2 DESC"
l_drwデータロウズ = l_dstマスタ.Tables("テーブル名").Select(Nothing, l_strソート条件)


'抽出結果を、新たなデータセットへマージする(データテーブルでもマージ可能)
Dim l_dstデータセット As New DataSet()
l_dstデータセット.Merge(l_drwデータロウズ)

この回答への補足

たとえば、郵便番号データ(約12万件)で、それを郵便番号順に300件ずつ表示するとします。
ソートする以前に12万件のDatasetを取得しないといけないのですが、この時点で非常に
時間がかかってしまいます。

Dim l_dstマスタ As DataSet
l_dstマスタ = データセット取得()

この時点でしょうか・・・

補足日時:2006/04/19 15:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!