最新記事
カテゴリアーカイブ
<< 2024年12月 >>
1
2 3 4 5 6 7
8
9 10 11 12 13 14
22
23 24 25 26 27 28
29
30 31

【サンワダイレクト】ポータブルHDD
富士通 FMV LIFEBOOK EH
Z会Asteria 英語4技能講座
リンク

2021年04月16日

MS-Accessの起動が激オソになる事案が発生(´・ω・`)

ある日突然、

MS-Accessのリンクテーブルを使用した 業務アプリの起動時間が激オソになり、
な、 なんと1分以上! かかる事案が発生しました(´・ω・`)

※【参考】激オソ対象環境
 PC:Corei5(10400)+メモリ8GB+256GSSD
 OS:Win10 Pro (x64・20H2)
 Office: Access2019 2019 MSO(16.0.13901.20148)32bit
 対象:アプリ本体:ACCDB形式+リンクテーブル先DB:MDB形式


まあ、年度末でなんかバタバタで、「 壊れたんじゃないか!? 」ってくらい起動時激オソでも、
一度起動してしまえばフツーに動くもんだから、しばらく放置プレイ状態・・・(;^_^A

もう一台のPC
 PC:Corei5(9400)+メモリ8GB+256GSSD
 OS:Win10 Pro (x64・20H2)
 Office: Access 2016 (32bit版)
では、通常の速度で起動する状況・・・


Accessのバージョンの違いなのか? Win10OSの問題なのか?

手持ち環境で検証すると以下の結果・・・(※Accessは全て32bit版)

 ◯ 2013ランタイム:Win10Pro(x64・20H2)Corei7(7th)  1.5秒
 ◯ 2016ランタイム:Win10Pro(x64・2004)Corei5(9th)   2秒
 ◯ 2016通常版  :Win10Pro(x64・20H2)Corei5(9th)   2秒
 ?2019通常版  :Win10Pro (x64・20h2) Corei5(10th)  80秒!!←激オソ(´・ω・`)

といった状況・・・



こんなときは、やっぱり Google先生に尋ねる しかない!

Google-MSAccess-tooslow(´・ω・`).png


MS様公式のサポートが出てまいりましたヽ(=´▽`=)ノ


Access 2002、Office Access 2003、および Office Access 2007 のリンク テーブルでパフォーマンスが低下する

当方 Access2019 なんですが、共有してる DB形式はMDBのままだし、これいけるかも!? と思って試した見たところ、 まあまあの結果がでました ので、以下メモ。

手順メモ

(1)激オソ対象のAccessファイルを開き、上記モジュールをコピペ



  1. Sub TurnOffSubDataSheets()

  2.     Dim MyDB As DAO.Database

  3.     Dim MyProperty As DAO.Property

  4.     Dim propName As String, propVal As String, rplpropValue As String

  5.     Dim propType As Integer, i As Integer

  6.     Dim intCount As Integer


  7.     On Error GoTo tagError


  8.     Set MyDB = CurrentDb

  9.     propName = "SubDataSheetName"

  10.     propType = 10

  11.     propVal = "[None]"

  12.     rplpropValue = "[Auto]"

  13.     intCount = 0


  14.     For i = 0 To MyDB.TableDefs.Count - 1

  15.      If (MyDB.TableDefs(i).Attributes And dbSystemObject) = 0 Then

  16.      If MyDB.TableDefs(i).Properties(propName).Value = rplpropValue Then

  17.      MyDB.TableDefs(i).Properties(propName).Value = propVal

  18.      intCount = intCount + 1

  19.      End If

  20.      End If

  21.     tagFromErrorHandling:

  22.     Next i


  23.     MyDB.Close


  24.     If intCount > 0 Then

  25.      MsgBox "The " & propName & " value for " & intCount & " non-system tables has been updated to " & propVal & "."

  26.     End If


  27.     Exit Sub


  28.     tagError:

  29.     If Err.Number = 3270 Then

  30.      Set MyProperty = MyDB.TableDefs(i).CreateProperty(propName)

  31.      MyProperty.Type = propType

  32.      MyProperty.Value = propVal

  33.      MyDB.TableDefs(i).Properties.Append MyProperty

  34.      intCount = intCount + 1

  35.      Resume tagFromErrorHandling

  36.     Else

  37.      MsgBox Err.Description & vbCrLf & vbCrLf & " in TurnOffSubDataSheets routine."

  38.     End If

  39. End Sub




(2)VBAエディタでイミディエイトウィドウを開き、「 TurnOffSubDataSheets 」を実行

(3)実行すると、下記結果が表示

MS-AccessVBA-TurnOffSubDataSheets.png
   ※ここでは50個のテーブルに「サブデータシート名=なし」処理。


で、以下、 MS様の説明詳細をコピペ


Office Access 2007、Access 2003、Access 2002、および Access 2000 では、サブデータシート内にテーブルの関連レコードを表示できます。この機能は、Access 97 では使用できません。 主テーブルと関連テーブルとの間のリレーションシップを管理するために、システムで追加のオーバーヘッドが必要になり、これにより応答時間が長くなる可能性があります。特に、データベース内に数多くのリンク テーブルが存在し、それらのテーブル間に多くのリレーションシップがある場合に影響が顕著になります。

一対多リレーションシップの主テーブル ("一" の側のテーブル) では 、"サブデータシート名" プロパティを [なし] に設定できます。 この場合、サブデータシートは表示されません。また、この テーブルの "サブデータシート名" プロパティは特定の関連テーブルの名前に設定するか、[自動] に設定することもできます。このプロパティが [自動] に設定されている場合は、主テーブル内でレコードの展開インジケータをクリックしたときにレコードを表示する関連テーブルを選択できます。このプロパティを [自動] に設定すると、パフォーマンスが著しく低下する可能性があります。これは特に、コンピュータが古く、データベースで数多くのリンク テーブルが使用されている場合に顕著になります。 この現象は、テーブルがすべて同じデータベース内にある場合には発生しません。

効果のほどは???

 ◯ 2013ランタイム:Win10Pro(x64・20H2)Corei7(7th)  1.5秒:効果なし
 ◯ 2016ランタイム:Win10Pro(x64・2004)Corei5(9th)   2秒:効果なし
 ◯ 2016通常版  :Win10Pro(x64・20H2)Corei5(9th)   2秒:効果なし
 △2019通常版  :Win10Pro (x64・20h2) Corei5(10th) 11秒!!←微妙^^;



80 もとい秒!に比べればまし、贔屓目で「まあまあ」ですが、

やはりこの結果は「微妙」なので「△」としました(´・ω・`)




更に調べてみると、

(1)そもそも「リンクテーブル」で対象DBを共有する使用法が邪道^^;
   Accessとはいえ、ADOを駆使した、本格的な?DB構成にしないと駄目。(超意訳^^;) Accees開発サポート様


(2)ネットワークOfficeファイルを開く際に、プログラムの速度が遅い、または応答が停止する (ハングする) 場合があります。 MS様

(3)PCとか通信環境が貧弱じゃね!?(意訳^^;) MS様

とか、Access(というよりOffice製品か?)で、
速度が著しく低下する事案は、
割とメジャーな不具合なようです。(´・ω・`)



(1)についてはプログラムを組み直す必要があり、
   効果はてきめんでしょうが、 面倒なので^^;却下(´・ω・`)

(2)は、レジストリを追加するだけだから実行済。
   効果はある模様( ・?ω・?)


(3)は、まあ、一般論ですねぇ(´・ω・`)




【まとめ】


とりあえずは、

 ・ サブデータシートのリレーション「無効」
  (TurnOffSubDataSheets 関数の実行)

  (80秒→11秒)

レジストリを追記し、ファイルキャッシュを「無効」
  (11秒→8秒)

の組合せで、まあ、許容できる起動時間となりました。^^;



なにか、劇的な改善方法があれば、是非教えてくださいm(_ _)m
※Access2013とか2016に戻すとかは無しで^^;


【追伸・言い訳】
あくまでも当方の環境での結果ですので、お試し頂いて効果が出なくても
当方は一切関知いたしませんので、ご容赦願いますm(_ _)m
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

認証コード: 必須項目

※画像の中の文字を半角で入力してください。

この記事へのトラックバックURL
https://fanblogs.jp/tb/10652782

この記事へのトラックバック
Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: