2012-02-14 11 views
1

3つのフォームを持つDelphiアプリケーションがあり、Access 2003とMicrosoft.Jet.OLEDB.4.0を使用しています。それはすべての形で。MS Accessを使用したDelphi ADO - 特定のクエリを実行するとクエリ時間が短縮される

2つの.mdbファイルを使用します。my.mdbには、org.mdbテーブルへのリンクがあります。

すべて機能しますが、非常にゆっくりです。長い時間の検索の後、私はこれに来ました。

私はこのクエリーを実行した後、他のすべてのクエリーが劇的に(10秒から1秒に)増加します。 (リンクされたテーブルを解消しないクエリでも)。

テーブルtb_odsotnostはmy.mdbにあります。
テーブルUserinfoがリンクされています。

with rQueries.ADOQuery1 do 
    begin 
    Close; 
    SQL.Clear; 
    SQL.Add('SELECT DISTINCT tb_odsotnost.UserID, Userinfo.Name FROM tb_odsotnost'); 
    SQL.Add('LEFT JOIN Userinfo ON Userinfo.UserID = tb_odsotnost.UserID'); 
    SQL.Add('WHERE datum BETWEEN '+startDate+' AND'+endDate); 
    SQL.Add('ORDER BY Userinfo.Name ASC'); 
    Open; 
    end; 

win7とMS Access 2007を搭載した別のコンピュータでアプリケーションを実行しようとしましたが、結果は同じでした。

今のところ私はonFormActivateでこのクエリを実行しますが、これは永続的な解決策ではありません。

+0

あなたの質問は何ですか? – RRUZ

+0

SQLのこの小さな平和は他のすべてのquieriesにどのように影響しますか?私はプログラムを起動するたびにこのクエリを実行したくありません。それ以外のクエリは速くなければなりません。だから私はアクセスがいくつかの "機能性/現金化"を持っているのだろうかと思っていた。私は気づいていない。それは隠された関係を作りますか?私はプロシージャを新しいフォームに移動し(新しい接続を作成して)、別のクエリを実行しようとしましたが、結果は同じでした。上記のクエリを実行するまではすべてが遅くなります。他に何が確認できるか分かりません。 – user805528

答えて

3

リンクテーブルに対してクエリを実行すると、Access(またはJetまたはADO)はldbファイルのデータベースのロックを取得します。クエリを閉じると、次にそのリンクテーブルをクエリするときにそのロックを再度取得する必要があります。これを回避するには、バックグラウンドデータセットを常に開いたままにして、毎回ロックを取得する必要がないようにする(ロックを強制的に有効にする)ことをお勧めします。

http://office.microsoft.com/en-us/access-help/improve-performance-of-an-access-database-HP005187453.aspxを参照し、「リンクテーブルのパフォーマンスを向上させる」セクションを参照してください。

それでも問題が解決しない場合は、Accessのテーブル定義を参照して、テーブルフィールドにサブデータシートが1対多の関係で定義されているかどうかを確認してください。

関連する問題