DBの更新タイミングについて

解決


studio-take  2011-06-06 07:09:11  No: 40622

複数のQueryで同じテーブルをOpen中に
片方で更新したものを別のQueryにも反映させたいのですが、
Close;
Open;
だとレスポンスが著しく落ちるので、Queryを開きっぱなしで
互いに最新の状態に置くにはどうしたらいいでしょうか?

よろしくお願いします。


  2011-06-07 01:20:45  No: 40623

Queryを開きっぱなしで同期を取る方法はないと思います。

まさか、INDEXなしでDBを使っているなんてことはありませんよね。

もう少し自身の状況を明らかにされるとレスポンス改善策のレスがつくかも。
例えば、
レスポンスが著しく落ちるとは具体的に応答時間にどのくらいかかっているのか
(レスポンスは良いに越したことはありませんが、許容値は結構個人差があります)
文面からは、同一アプリ内の複数Queryと読み取れるがそうなのか
DBは何を使用しているのか
テーブル(DB)は同一マシン上か、ネットワーク上の別マシンにあるのか
同じテーブルとあるがテーブルは一つか、複数をJOINしているのか
テーブルにある現状のデータ数
Queryで検索するデータ数
などなどです。


studio-take  2011-06-07 08:00:18  No: 40624

Indexは具体的な使い方がわからず、使ったことがありません。

データベースは、DBISAMです。
ローカルで使っています。
レコード数は4000ぐらい。
テーブルは単体です。
Queryのひとつは、グリッドに一覧リスト表示用で使ってます。
もうひとつは、カード式で個別に内容を編集登録するためのやつです。
画像をBlob保存してるので、これが影響しているんだとは思いますが。
一覧は、キーコードと名前だけなんで軽いんですが、カード式の方が一回Closeすると10秒ぐらい待たされます。


Mr.XRAY  2011-06-07 08:26:32  No: 40625

こんにちは.Mr.XRAYです.

>Indexは具体的な使い方がわからず、使ったことがありません。

ということですが,DBISAMに限らず,ほとんどのデータベースは,
インデックスなしだと,一般的にクエリー等の実行に十分なパフォーマンスが得られません.
インデックスがないと,表のデータが,たった数レコードでも,とても遅いです.

特別な例は,JETデータベースです(Accessという,マイクロソフトが提供しているデータベース
操作用のアプリで使用しているデータベースエンジン)です,
これは,インデックスなしでも,そこそこの速度で動作します.

では,がんばってください.


Mr.XRAY  2011-06-07 08:47:17  No: 40626

Mr.XRAYです.

DBISAMでしたら.以下のページも参考にしてみてはいかがでしょうか.

>(6)Indexを定義します

という説明もあります.
http://www.teppi.com/Components/DBISAM/dbisam_0030/

急がば回れといいます.どれか,上のサイトの記事でもいいですから,
一度,サンプルを真似したデータベースのテストをしてみると,いろいろ見え
てくるのではないかと思います.


  2011-06-07 18:21:06  No: 40627

亀です。
>画像をBlob保存してるので、これが影響しているんだとは思いますが。
>一覧は、キーコードと名前だけなんで軽いんですが、カード式の方が一回Closeすると10秒ぐらい待たされます。
カード式の方へ画像を表示しているのであれば、この画像表示を一度中止して応答速度を確認してみてはどうですか。
画像表示をしない時の速度に問題がなければ、応答の足を引っ張っているのは
  DBからの画像(BLOB)読み込みとメモリ(Image)への展開、表示ということになり
Queryによる検索の速度とは別問題ということになります。

私も、ボロマシン(何しろ20世紀のマシンです)でJPEG画像を扱うDBを作成して遊んでいますが、
200〜300K程度の画像であれば表示に1秒もかかりませんが、3M〜4M程度の画像になると十数秒〜1分程度待たされます。
普通の(BLOB以外の)レコード表示はマシン性能にもよりますが数ミリ秒のオーダーで動作しているので、
これに比べれば画像表示の1秒程度は遅く、データのスクロールはカクカクとしたものになります。
あきらめてレコード移動毎の表示をやめて、表示用のボタンをつけて必要な時にのみ画像を読み込むようにした経緯があります。


Quest  2011-06-07 19:51:05  No: 40628

リスト表示画面とカード表示画面が同時に表示されていない
または、両画面で表示している(リスト画面ではカーソルがある)レコードは
同じでもかまわないならば、思い切って1つのQueryをリスト表示と
カード表示にリンクさせてはどうでしょうか。
リスト表示は多分DBGridで、カード表示はそれぞれのフィールドにDBEditなどを
割り当てていると思いますので、それぞれのコンポーネントのDatasourceプロパティを
共通のDatasourceにしてしまえば同期できます。
ただ、両方の画面を同時に表示している場合はレコードの移動時(の画面更新)に
時間が掛かる可能性がありますが。


studio-take  2011-06-08 05:55:13  No: 40629

みなさん、ありがとうございます。
Indexの使い方を勉強してみたいと思います。

それと、データコントロールは使ったことがありません。
Delphiを教えてもらった方に使わない方がいいと教えられたので
ずっと普通の入力コントロールで代入してきました。
実際のところ、どちらが多数派なんでしょうか?


studio-take  2011-06-11 22:04:50  No: 40630

鉄飛の人にお尋ねしたら、RequestLiveをTrueで最小レコードの読み込みでOpenできると教えてくれたので、問題は解決しました。
やっぱりインデックスを設定した方がいいとも教えてくれました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加