■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#41433-0件数の多いデータが削除できないせい2001-04-07(土) 21:46
     #41434-0RE#41433:件数の多いデータが削除できないせつら2001-04-07(土) 23:36
     #41436-0RE#41433:件数の多いデータが削除できない魔界の仮面弁士2001-04-08(日) 01:09
#41433-0
件数の多いデータが削除できない
お世話になっております。

MDBのテーブルのデータを、一定期間経過した時点で削除するプログラムを作成して
いるのですが、
件数が多くなるとエラーになり、削除できなくなってしまいます。

エラーの内容は以下のようになっております
『ファイルの共有ロック数が制限を超えています (Error 3052)。』
MDBのロックのタイプを変更しても、結果は同じでした。

ついでに、WHERE条件を同じにして、SELECT命令・SELECT COUNT命令を
行った場合はエラーが発生しませんでした。

削除を行おうとした件数は、5,763,954件です。
件数の多すぎるデータは削除できないのでしょうか?

どうにかして、件数の多いデータを削除したいのですが、
いい方法がありましたらお教え下さい。



処理内容:
	バッチ的によびだされ、一定期間経過したデータを削除する。

環境:
	NT4.0 SP6
	ADO2.6
	Visual Stadio6.0 SP3
	Access2000

コード:
Public Sub deleteTabl(index As Integer, nowDate As Date, tblName as string)
    On Error Resume Next
    Err.Clear

    Dim delCN As ADODB.Connection
    Dim tblName As String
    Set delCN = New ADODB.Connection

    delCN.ConnectionString = strRegOpenSource   ''接続文字列
    delCN.Open

    Dim tmpDate As Date
    Dim delDate As String           ''削除日付
    Dim strSql As String

     tmpDate = DateAdd("h", -6, nowDate)
     delDate = Format(tmpDate, "YYYYMMDDHHNNSS")

    delCN.BeginTrans
    strSql = "DELETE FROM " & tblName & " WHERE coldate < '" & delDate & "'"
''一定期間経過データ削除する命令
    delCN.Execute (strSql)
    If Err Then
        delCN.RollbackTrans
        Debug.Print "テーブル・" & tblName & "のデータの削除に失敗しました。
" & vbCrLf & Err.Description
        Err.Clear
    Else
        delCN.CommitTrans
    End If

    delCN.Close
    Set delCN = Nothing
End Sub
#41434-0
RE#41433:件数の多いデータが削除できない
MDB で600万件とは、よく壊れないものだと感心してしまいます。 2000 は丈夫になったのですね。

一気に消そうとすると、対象件数が多いせいで、DBが扱いきれなくなります。 だから、日数等で
区切って、1回で2万〜3万件程度になるように、分割して削除してみてください。
#41436-0
RE#41433:件数の多いデータが削除できない
> 『ファイルの共有ロック数が制限を超えています (Error 3052)。』
トランザクションログ生成に必要となる、ワークドライブ(というかTEMPフォルダ)の
空き容量が充分であるかを確認しておいてください。

また、トランザクションに必要なページロック数を
規定値(9500ロック)以上に増やしてみてはどうでしょう。

この値を永続的に変化させる場合は、レジストリの
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0\MaxLocksPerFile
を変更させればOKです。

一時的に変化させる場合は、DAOであれば、
   DBEngine.SetOption dbMaxLocksPerFile, 200000
のようにすればOKです。

ADOの場合のやり方は知りませんが、プロパティの名前から判断するに、恐らく、
   MyConnection.Properties("Jet OLEDB:Max Locks Per File").Value = 200000
あたりで修正できると思います。(確認はしていません)
他にあやしそうなプロパティとしては、"Jet OLEDB:Page Locks to Table Lock"あたりでしょうか。

# ただし、上記の事が、今回の内容に関係あるかどうかはわかりません……。
# Access/Jetに詳しい方、フォローお願いします。m(_ _;)m


> ついでに、WHERE条件を同じにして、SELECT命令・SELECT COUNT命令を
> 行った場合はエラーが発生しませんでした。
アクションクエリや編集動作を発行しない限りは、
レコードロックやページロックが発生しないのではないでしょうか。


> 削除を行おうとした件数は、5,763,954件です。
一度に削除するデータ量を、3MB程度までに区切って処理してみてはどうでしょう。

もし、トランザクション処理の関係上、分割するわけにいかないのであれば、
ロック単位を大きくしてみれば、削除できるようになるかもしれません。
ページロックの使っているのであれば、テーブルロックにしてみてください。
それでダメなら、テーブルロックに切り替えて、トランザクション無しで処理してみてください。

# データベースロックに切り替えれば、確実に削除できるとは思うけれど(泣)
このページと関連する記事:
#6884-0SQL文のCOUNT関数について2000-03-24(金) 14:19
#2235-0ありがとうございます。1999-10-12(火) 12:00
#38494-0分散トランザクションモード??2001-02-08(木) 14:21
#854-0sql文教えてください。2001-10-21(日) 12:05
#1671-1ACCESSデータについて2004-04-14(水) 18:11
#29642-0表の結合2002-06-27(木) 11:58
#27165-0OracleでのSQL構文2000-08-02(水) 17:54
#24955-0VBを用いた場合のACCESS2000のレコードロックについて2000-07-04(火) 19:35
#336-1クエリ式の構文エラー2004-03-03(水) 19:04
#1601-2MSFlexGridの複数列でのソート2002-07-11(木) 10:04
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)