お世話になります。
環境:Access2003
SQL Server 2008 R2 Express
先日、Accessのローカルにあるテーブルが20万レコードを超えた為、SQLサーバーへ移行しました。
しかし、Accessより削除クエリにて(フォーム上に設置した削除ボタンにて)当該テーブルのレコードを削除しようとすると、4分ほどかかりました。
なお、ローカルにあったときは上記操作をしても2、3秒程度で削除完了してました。
PCのスペックやテーブルのレコード数によるかとは思うのですが、ローカルテーブルとSQLテーブルでこんなに時間が違うものなのでしょうか。
また、回避策や何か設定すれば早くなるなどございましたら、ご教授頂けたらと思います。
宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
SQL Server 側の設計をどのようにしたのかわからないが、適切なインデックスを作成し、クエリの見直しを行うのが第一歩だと思う。
一般的に WHERE で使われる列はインデックス候補となりやすいため、受注日のインデックスを作成する。
そしておそらくは VBA のコードの中で
Dim sql As String
sql = "DELETE testデータ.受注日 FROM testデータ WHERE ((testデータ.受注日)=#" & juchu & "#));"
とかやっているのかと思うが、SQL 文を動的に作成して実行するのをやめて、SQL Server 側にストアド プロシージャとして作成しなおし、UI 側からはこのプロシージャに必要な日付値を与えてキックする方法にする。
とりあえずそんなところか?
この回答への補足
結果的に、SQL上で当該テーブルのIDを主キーとし、更に受注日をインデックスすることにより、削除クエリを実行しても2、3秒で削除することが出来るようになりました。
補足日時:2012/11/08 19:46ご回答ありがとうございます。
>適切なインデックスを作成し、クエリの見直しを行うのが第一歩だと思う。
主キーとインデックスの違いもいまいち分からない状況です。。
当該テーブルはSQL側ではどのフィールドにも主キーをもたせず、Accessより当該テーブルのリンクテーブルを作成する際に『ID』フィールドを主キーとして指定しました。で、その状態で削除クエリが重いので、受注日を主キーとしたリンクテーブルも作成しました・・・しかしそのテーブルで削除クエリを実行すると『1行の更新/削除により、1行以上のリンクテーブルに影響がありました。固有インデックスに重複する値が含まれています。』とエラーになり、削除できませんでした。
このエラーについて調べたところ『実行した更新クエリまたは削除クエリの効果が、リンクされている SQL テーブルにあるほかのレコードにも作用しました。更新および削除クエリは、1 回に 1 つのレコードのみに作用します。』ということでした。当該テーブルには同じ受注日が複数レコード存在してます。主キーを指定したフィールドで抽出した場合、複数レコードを一括して削除できない??ということなのでしょうか。。
>SQL Server 側にストアド プロシージャとして作成しなおし、
>UI 側からはこのプロシージャに必要な日付値を与えて
>キックする方法にする。
については、勉強不足ですみません。。
No.2
- 回答日時:
おそらくAccessでリンクテーブルを開いてそこで削除処理をしているのでしょう。
これはAccessがSQLのデーターを特定できてないからです。つまり20万件の情報を読み込むだけ読み込む。さらにAccess側で削除レコードを特定する。そのレコードをまたSQLに問い合わせる。問い合わせて見つかったレコードに削除の処理をかける。SQLに反映させる。そういう大量データーの行ったり来たりを行っていると考えられます。Accessにはレコードを特定できる機能はないので。カーソル処理と言ってポインターを置くだけなんです。
ですからAccessをSQLにつなぐ場合はリンクテーブルを使ってはダメなのです。VBAで書くか、あるいはパススルークエリーで表示だけさせる。さらにExecuteコマンドで特定のレコードにDELETE SQL文を直接投げる。これでおそらく一秒もかからず処理できます。
つまり乗りこなすには、それだけ知識も勉強も必要だということです。
No.1
- 回答日時:
SQLServerとは大規模なデーター処理にも耐えうる設計になってます。
つまり安全に処理もできればスピード優先の処理もできます。ただその加減は開発者のスキル次第と言う事になります。つまりオートマの車なら特によいですが、F1の車ですから、テクニックとメカニックのサポートが必要なのです。
削除とはどういう処理かと言えば、削除対象を検索して、テーブルに削除フラグを立て、ログをログ領域に書き出す処理です。つまり大変な処理なんですよ。これは後から処理をトレースして確実に戻すこともできるためです。さらに削除領域にはデーターは残るのでいつかはコンプレス作業も必要です。削除を繰り返すとログ領域がいっぱいになり、何時かはエラーになります。知らないうちにHDDがいっぱいと言うのはこのためが多いです。
この場合は古いログ領域を切り捨てる必要があり、切り捨てコマンドを打つかバックアップコマンドでバックアップするかしかありません。
単純にAccessのように使いたいというならAccessの方が便利です。ですがどうしても削除する場合はログを取らずに消すことができます。これはSQLコマンドの後にログを取らないコマンドをつける。あるいはテーブルのデーター全部を消す場合はTruncateのコマンドでクリアできます。
当然これらの処理ではデーターが戻らなくなるので、通常はやりません。なぜなら大きな大事な情報を預かるDBですから。
この回答への補足
SQL上にて当該テーブルのIDを主キーとしたところ、削除クエリの実行が2、3秒で出来るようになりました。但し、この状態だと、受注日でFindfirstするのに時間がかかる為、更に受注日をインデックスすることによって削除も早くでき、受注日のFindfirstも早くできるようになりました。
補足日時:2012/11/08 19:52早速のご回答ありがとうございます。
今回AccessのローカルテーブルをSQLへ移行した理由としては、レコード数が増えたのと、他のPCよりDBを参照させたい為でした。
このテーブルには『受注日』というフィールドがあり、削除クエリではその日付を条件にレコードを削除しています。
DELETE testデータ.受注日 FROM testデータ WHERE ((testデータ.受注日)=#" & juchu & "#));
※juchu変数にはフォーム上で選択された受注日が入ってます。
単純に選択クエリだと2、3秒で抽出できるているので、あとはそのレコードを削除すればいいだけなので、なんでそんなに時間がかかるのか・・・と思った次第です。
確かに教えて頂いた通り、SQLでは削除するにもログに書き込んだり色々やっているのでしょうが、こんなに時間がかかるものなのでしょうか。。
実際にAccessのローカルテーブルの場合だと、選択クエリで抽出するぐらいの時間で削除できています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
数百万件レコードのdelete
SQL Server
-
SQLServerで同一条件レコードの削除ができない
SQL Server
-
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
-
4
Access クエリ実行が急に非常に遅くなりました。
Access(アクセス)
-
5
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
6
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
7
Access サブフォームでの選択行の取得
その他(データベース)
-
8
ACCESSで指定されたテーブルから削除できませんでしたとエラー
その他(データベース)
-
9
更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま
その他(データベース)
-
10
Access終了時の最適化が失敗?
その他(データベース)
-
11
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
12
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
13
「RunSQL」と「Execute」の違い
Access(アクセス)
-
14
どこにもフォーカスを当てたくない
Access(アクセス)
-
15
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
16
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
17
ACCESS──メインフォームでサブフォームのレコード件数をカウントしたい
Access(アクセス)
-
18
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
19
ACCESSでエラー時に再起動する方法
その他(データベース)
-
20
SELECTした結果に行番号を求めたい
PostgreSQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
Accessの重複クエリで最小以外...
-
(ACCESS)並び替えをしないで...
-
Access VBA Me.Requery レコー...
-
数百万件レコードのdelete
-
フォームからのレコード削除に...
-
ManagementStudioからのデータ削除
-
Access 抽出したレコードのうち...
-
SQLiteで最も古いレコードのみ...
-
SQLServerで同一条件レコードの...
-
ACCESSデーターベースの差分バ...
-
ACCESSにて全項目(レポート)...
-
3つのテーブルから値を取得する
-
Accessでの排他制御
-
SELECT COUNT(*) について ( PHP )
-
ACCESSのBookmarkプロパティの...
-
データの二重表示の原因
-
非連結サブフォームのレコード...
-
Accessでレコードが更新された...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
Access 1レコードずつcsvで出力...
-
Access VBA Me.Requery レコー...
-
2つの項目が重複するレコード...
-
数百万件レコードのdelete
-
非連結サブフォームのレコード...
-
ACCESSのBookmarkプロパティの...
-
Access 削除クエリが重い
-
ManagementStudioからのデータ削除
-
SQLServerで同一条件レコードの...
-
Access カレントレコードがあり...
-
Accessでの禁止文字チェック
-
Accessでの排他制御
-
テーブルのレコード削除ができ...
-
Accessの重複クエリで最小以外...
-
(ACCESS)並び替えをしないで...
-
Accessで重複したデータを一件...
-
Accessでレコードが更新された...
おすすめ情報