喫茶XRAYトップページ

[スレッド全体
]

[6891] 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 15:45:11 Syake
貴方は一度に10行のレコードを読み込みますか?
1万行はあるけど10万行は無い?

そんな貴方にお勧めです。
TDBXReaderでデータをLoadしてみませんか。


10万行(DBX)
        FieldByNameで呼出し 約51秒
      Fieldsで呼出し      約43.7秒
1万行(DBX)
        FieldByNameで呼出し 約5.1秒
      Fieldsで呼出し      約4.4秒

これでも早いですか?


10万行(TDBXReader)
        Value['xxxx']で呼出し 約6秒   //フィールド名で呼出し
      Value[X]で呼出し      約3.5秒
1万行(DBX)
        Value['xxxx']で呼出し 約0.6秒    //フィールド名で呼出し
      Value[X]で呼出し      約0.34秒

これでも遅いですか?




[6899] Re:時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 20:41:19 snail3
Syakeさんこんにちは

計測条件をもう少し詳しく教えていただけませんか。

そもそもTDBXReader自体を知らないじいさんですが
時間短縮したいと考えています。

私も色々と試す必要があって少し前に時間を計ってみました。

計測したDBは ORACLE と SQLite です。

10000件リード
SQLite 1回目  4Sec 2回目 10sec ←ローカルマシン
SQLite 1回目 17Sec 2回目 30sec ←ローカルマシンADO
Oracle 1回目 17Sec 2回目110sec ←サーバーADO接続

時間は参考程度で見てください。


計測に利用したSQL文
----------------------
SELECT MHIN_HINCD,MHIN_JITSUCD,MHIN_HINMEI
,MHIN_CLASSSHIWA,MSWA_MEISYOU
,MHIN_CLASSHIN,MHBU_MEISYOU
,MHIN_CLASSTAN,MHIN_TANICD,MHIN_IRISU
,MHIN_TANKA,MHIN_CTANKA,MHIN_CTANKMI,MHIN_CTANFEN,MHIN_CTANKYOU
,MHIN_CTANKRI,MHIN_TANKAGEN,MHIN_TANKAURI,MHIN_TANKAHYOU,MHIN_ZAIKANYN
,MHIN_GENZAIKANYN,MHIN_HACHUTEN,MHIN_HACHUSU,MHIN_HACHU,MHIN_HHINBAN
,MHIN_STANCD,MHIN_RRANK,MHIN_MRANK,MHIN_BIKOU,MHIN_PASS
,MHIN_HAISHIYMD,MHIN_HAISHIYMDK,MHIN_SOZAI,MHIN_IRO,MHIN_SYOUSAI
,MSEI_MNO,MSEI_SERIES,MSEI_KIHONKEI,MSEI_GEN,MSEI_TOUROKU
,MSEI_SHOUNIN,MSEI_HAIFU,MSEI_OVERSEA,MSEI_INTER,MSEI_OEM
,MSEI_MIC,MSEI_NANI1,MSEI_NANI2,MSEI_OMOTEA
,MSEI_DOUSUN,MSEI_SAO,MSEI_BIKOU
,MBD_WU,MBD_WL,MBD_L,MBD_HU,MBD_HL,MBD_HA
,MBD_HS,MBD_BIKOU
,MSB_TYPE,MSB_GEN,MSB_HABA0,MSB_HABA12,MSB_NAGASA
,MSB_ATSUMI,MSB_HABA,MSB_FUKASA,MSB_PITCH,MSB_FSU
,MSB_BIKOU
 FROM MHIN
 LEFT JOIN MSEI ON MHIN_HINCD = MSEI_HINCD
 LEFT JOIN MBD  ON MHIN_HINCD = MBD_HINCD
 LEFT JOIN MSB  ON MHIN_HINCD = MSB_HINCD
 LEFT JOIN MSWA ON MHIN_CLASSSHIWA = MSWA_CLASSSHIWA
 LEFT JOIN MHBU ON MHIN_CLASSHIN = MHBU_CLASSHIN
order by  MHIN_HINCD

実際の取り出しコーディング(SQLite)
----------------------------------
  WrkSQLIteTable.MoveFirst;
  while WrkSQLIteTable.EOF = False do          // UTF8Encode(
  begin
    WrkListItem  := KELV1.LVO.Items.Add;             // ←行追加
    Inc( WrkIdx1 );
    WrkListItem.Caption := IntToStr( WrkIdx1 );      // 行タイトル

    WrkStr := WrkSQLIteTable.FieldAsString[1];// .FieldByName[ 'MHIN_HINCD'];

    WrkStr := WrkSQLIteTable.FieldByName[ 'MHIN_HINCD'];
    WrkListItem.SubItems.Add( WrkStr );         // 1列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MHBU_MEISYOU'] );
    WrkListItem.SubItems.Add( WrkStr );         // 2列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MSWA_MEISYOU'] );
    WrkListItem.SubItems.Add( WrkStr );         // 3列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MHIN_HINMEI'] );
    WrkListItem.SubItems.Add( WrkStr );         // 4列目に値設定

    WrkSQLIteTable.Next;
  end;

ちなみに取り出したデータを ListView にセットしない↓の場合は
SQLite ローカルの場合 0.7秒/1万件でした

  while WrkSQLIteTable.EOF = False do          // UTF8Encode(
  begin
    WrkStr := WrkSQLIteTable.FieldByName[ 'MHIN_HINCD'];
    Inc( WrkIdx1 );
    WrkSQLIteTable.Next;
  end;



[6901] Re2:時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 21:15:46 snail3
TDBXReader=DBX (dbExpress)ですか?



[6904] Re3:時間短縮したいとお望みの貴兄に返信 削除
2013/4/23 (火) 08:27:28 Syake
▼ snail3さん

ご承知の通り、ADO接続で大量のレコードを高速に読み込みには
 ・clUseServer,ctOpenForwardOnly,ltReadOnlyの設定で有ること
 ・Fieldが多い場合はFieldByNameでは無くFields(配列値指定)を使う
  (最も視認性は悪くなります)
 クライアント機でも改善に繋がります。

でもADOはdbExpress(SQLDataSet使用)にはかないません。
前方向カーソルだけなので、利便性は悪いですが高速データアクセスは
とっても魅力です。
RDBMSの固有の機能には対応できません。

FireDACは汎用性が高く、幾つかのRDBMS固有の機能にも対応しているよう
です。
ADOやdbExpress(SQLDataSet)よりデータアクセスは早かったです。
ADOやdbExpressに比して利便性もこちらの方が上だと確信します。
BDEの後継になり得るでしょう。多分。
(但しエンタープライスエディションでないと無償になりません)


早さだけで言うならどれもTDBXReaderにはかないません。
Datasnapのお勉強中に見つけました。
知らないことがたくさんあります。(;_;)
まあ、「使えて良いなら何でも」って感じです。




[▼次のスレッド]
INCM/CMT
Cyclamen v3.82