RE: Compact Data
ongke0711 > 16-11-19, 10:01 AM
(15-11-19, 03:30 PM)Minh Tiên Đã viết: Cứ cũng file đó mở lên design form, module, ... 1 thời gian là phình lên 30 M có khi 60M làm mọi thứ đều ko xuống.
Nhưng mở database mới ,Import qua database mới này là chỉ còn 15M.
Tìm mãi ko biết nó phình lên là do gì ?
Nếu trong quá trình thiết kế mà nó phình lên thì cũng không lạ lắm. Tôi tưởng là file thành phẩm rồi.
Cái vụ này cũng do nhiều nguyên nhân lắm đây. Bạn nên kiểm tra từng hạng mục như Table tạm, Query...
1. Trong giai đoạn phát triển ứng dụng, thì Access sẽ cấp cho một không gian bộ nhớ (pages data) cho việc thiết kế các form, table, code v.v.. Page data sẽ phình lên rất nhiều trong khi thiết kế và cái page data này không phải lúc nào cũng được giải phóng bởi lệnh "Compact & Repair". Nguyên nhân thì tôi chịu, Access nó cũng vô chừng lắm.
2. Query: nếu dùng code VBA để tạo QueryDef, xử lý nó mà không dùng "saved query" trong ngăn Query thì nó cũng làm phình ứng dụng FE lên nhiều. Lý do là khi chạy thì Access mới kết nối, tạo query, việc xử lý này không tốn tài nguyên (tốc độ xử lý) nhưng lại chiếm nhiều không gian bộ nhớ lưu trữ cho nó.
3. Các table tạm: cái này đối với tôi là quan trọng và một cái kinh nghiệm của tôi về Table tạm là tôi không dùng "record-level locking". Cái locking này khác với locking trong Form property nhé. Nó nằm trong Access Option - Client Setting -> bỏ chọn "Open databases by using record-level locking".
+ Khi chọn mục này, mỗi khi Access thực thi các hoạt động như Insert, append... Access sẽ dành thêm rất nhiều không gian bộ nhớ để lưu cho từng record. Bạn test thử xem khi insert 50k dòng vào 1 table tạm nào đó với việc bật tắt "record-level locking" sẽ thấy dung lượng file .accdb tăng lên như thế nào.
+ Khi tắt record-level locking, bạn sẽ thấy tốc độ insert, append tăng lên rất nhiều (tôi test là nhanh hơn 10 lần).
+ Bạn vẫn có thể dùng tính năng khoá record trong Form (Lock: edited record) hoặc dùng ADO để thực hiện việc khoá các record đang chỉnh sửa trong môi trường đa người dùng.
4. Decompile code:
Thường thì sau khi code xong bạn hay vô Debug - Compiled để biên dịch code vba thành mã máy để chạy cho nhanh. Mỗi khi bạn thêm Form, sửa code v.v.. thì cũng compile code. Nhưng khi xoá code, xoá form, report... thì cái "Source Code" đã compiled nó không tự động xoá các code cũ, code không hiệu lực nên cái đối tượng code này cũng phình lên. Đây là lý do phải Decompile code để xoá toàn bộ code đã compile sau đó Compile bộ source code mới.
Khi bạn import toàn bộ CSDL sang file .accdb mới thì lúc đó file này không chứa các data pages dư thừa, Object code dư thừa kể cả các table tạm (có dùng record-level locking) cũng giảm dung lượng đáng kể (gấp nhiều lần). Compact & Repair chỉ can thiệp được vào Table thôi chứ các khoảng code, data pages thì nó không có tác dụng.
Bạn xem lại các kỹ thuật này có tác dụng gì với CSDL hiện tại của bạn không nhé.
Còn việc Decompile, hướng dẫn thêm cho các bạn:
- Compact & repair database của bạn xong thoát Access hoàn toàn.
- Vào Run - dán dòng lệnh này vô để mở Access ở chế độ Decompile: msaccess /decompile - bấm OK.
- Mở database -> compile code -> Compact & repair -> Khởi động lại ứng dụng. Chắc chắn nó sẽ chạy hơn bản cũ.