mrsiro > 18-03-18, 10:23 AM
(17-03-18, 09:26 PM)ongke0711 Đã viết: Phải nói cho rõ thêm là điểm mạnh, yếu của cách dùng Form.Filter so với Form.Recordset (dùng câu lệnh SQL để filter - WHERE…).
Thực ra tôi cũng chưa trải nghiệm so sánh 2 cách này đối với CSDL lớn nhưng đối với CSDL nhỏ thì bạn chẳng thấy được sự khác biệt về tốc độ xử lý.
Tôi thường dựa trên nguyên tắc là “dữ liệu trả về” càng nhỏ thì tốc độ xử lý càng nhanh. Bạn sẽ thấy rõ điều này khi truy xuất dữ liệu của table trong file BE lưu trên máy chủ. Nếu bạn dùng câu lệnh SQL “Select… Where…” dữ liệu sẽ được lọc ít lại rồi mới đưa vào làm RecordSource cho Form. Nếu dùng Form.Filter thì RecordSource của Form sẽ load toàn bộ records rồi mới Filter theo điều kiện đưa vào sau đó. Từ đó ta thấy tốc độ load Form theo cách sau sẽ bị ảnh hưởng nhiều hơn cách đầu tiên. Hơn nữa nếu dùng “Select…Where..” thì bộ máy của Access sẽ tận dụng các chỉ mục (index) đã thiết lập sẵn của table để truy tìm, lọc dữ liệu nhanh hơn dò từng dòng trong Form.Filter.
Về điểm mạnh thì việc viết code vba của Form.Filter sẽ gọn hơn chút so với dùng “Select….Where…” thay thế Form.RecordSource.
Vd: khi bạn muốn hiển thị toàn bộ records
- Form.Filter: bạn chỉ cần dùng Form.FilterOn = False
- Form.RecordSource: bạn phải viết lại câu lệnh “Select * From…” rồi thay thế RecordSource của Form.
Nói tóm lại dùng câu lệnh “Select…Where..” sẽ nhanh hơn.
ongke0711 > 25-03-18, 08:32 PM
(18-03-18, 10:23 AM)mrsiro Đã viết: Hay quá, cho mình hỏi cái index, cái mà mình thắc mắc lâu rồi. Thường mình dùng định danh cho 1 record nào đấy bằng khóa chính, ví dụ mahd chằng hạn. Nhưng có cách nào tìm ra định danh cứng của record đó không, kiểu như không cần biết mahd là gì chỉ cần chỉ ra cái định danh cứng đó thì tự động tìm đến record tương ứng. Ví dụ như combobox ấy, dù cho record source có lấy từ bảng nào, nhưng trên vba chỉ cần dùng combobox.listindex là ra dòng thứ mấy trong combo đó. Tương tự không biết có cách nào tìm ra định danh cứng của record trên table hay không. Mục đích của việc tìm định danh cứng này của mình là để áp dụng vào việc tìm ra record nào đang bị khóa khi sử dụng form record lock.
Trên sqlserver thì có cái index cho từng record trên table, giúp cho truy vấn nhanh hơn. Không biết là trên access có cái index này không.