- Local time
- Today, 16:30
- Joined
- Feb 19, 2013
- Messages
- 17,363
As your db expands and there are more active users, it is quite possible you will experience performance issues and may be considering upsizing to SQL Server or MySQL.
Before considering such a transition, you should review your current design:
Overview
From a performance perspective, Access should be considered to be more like a web application than an Excel - and should be designed with the same considerations in mind - primarily to minimise network traffic.
Tables
1. are the tables properly normalised? If not, queries will be more convoluted and slower
2. have all lookups and multivalue fields been removed from tables? - they are not compatible with anything else anyway so will need to be removed if you are upsizing. In the meantime they have a drag on performance.
3. are the tables properly indexed? (any field which is used in joins or regularly used for searches and/or sorting should be indexed - but not those which mainly contain nulls or a limited range of values such as boolean fields) - see this link for more information - http://www.access-programmers.co.uk/forums/showthread.php?p=1516326#post1516326
Queries
4. have all domain functions been replaced with subqueries/sub tables? - domain functions are slow and do not use indexing - see this link for alternatives https://www.experts-exchange.com/articles/1921/Access-Techniques-Fast-Table-Lookup-Functions.html
5. are udf functions designed efficiently and reviewed to see if they can be moved to SQL? - udf functions are generally slower than SQL but sometimes cannot be avoided - but see the link in 4 above re the use of Static which can improve performance
6. have the initial wild cards used in searches (i.e. like *something*) been removed and users trained to use them when required? (the initial * negates the use of indexes with a resultant impact on performance) - see link in 3 above
Forms/Reports
7. Have these been designed to return only the records and fields required before being populated? - i.e. do not just have a table as a recordsource
8. have these been designed to not populate the sub forms/reports until required? - as a minimum on or after the main form current event
9. have any controls with domain functions been reviewed to see if the data can be included in the recordsource?
10. Are combo/listbox rowsources designed to only list what is required in both terms of width and depth? - having a combo listing 20,000 customer names is not efficient and slows the loading of a form. Instead leave the rowsource blank until a few characters have been typed by the user before then populating the rowsource based on what is typed.
Modules
11. do they have Option Explicit just below Option Compare Database?
12. are they compiled?
13. have you done a decompile?
14. are user front ends .accde and each user has their own copy?
15. has currentdb been assigned to a database object which is referred to in code rather than currentdb
16. does the front end maintain a persistent connection with the back end? - if 15 is done right, it will
Access
17. Has name autocorrect been turned off?
18. has front end been compacted?
Network
19. does it have sufficient bandwidth for the number of users and level of traffic?
20. can bandwidth be increased?
Much of the above would need to be addressed anyway to take advantage of the performance benefits of upsizing the backend and if there is not another reason for upsizing such as db size, improved security, high volume of concurrent users.
Before considering such a transition, you should review your current design:
Overview
From a performance perspective, Access should be considered to be more like a web application than an Excel - and should be designed with the same considerations in mind - primarily to minimise network traffic.
Tables
1. are the tables properly normalised? If not, queries will be more convoluted and slower
2. have all lookups and multivalue fields been removed from tables? - they are not compatible with anything else anyway so will need to be removed if you are upsizing. In the meantime they have a drag on performance.
3. are the tables properly indexed? (any field which is used in joins or regularly used for searches and/or sorting should be indexed - but not those which mainly contain nulls or a limited range of values such as boolean fields) - see this link for more information - http://www.access-programmers.co.uk/forums/showthread.php?p=1516326#post1516326
Queries
4. have all domain functions been replaced with subqueries/sub tables? - domain functions are slow and do not use indexing - see this link for alternatives https://www.experts-exchange.com/articles/1921/Access-Techniques-Fast-Table-Lookup-Functions.html
5. are udf functions designed efficiently and reviewed to see if they can be moved to SQL? - udf functions are generally slower than SQL but sometimes cannot be avoided - but see the link in 4 above re the use of Static which can improve performance
6. have the initial wild cards used in searches (i.e. like *something*) been removed and users trained to use them when required? (the initial * negates the use of indexes with a resultant impact on performance) - see link in 3 above
Forms/Reports
7. Have these been designed to return only the records and fields required before being populated? - i.e. do not just have a table as a recordsource
8. have these been designed to not populate the sub forms/reports until required? - as a minimum on or after the main form current event
9. have any controls with domain functions been reviewed to see if the data can be included in the recordsource?
10. Are combo/listbox rowsources designed to only list what is required in both terms of width and depth? - having a combo listing 20,000 customer names is not efficient and slows the loading of a form. Instead leave the rowsource blank until a few characters have been typed by the user before then populating the rowsource based on what is typed.
Modules
11. do they have Option Explicit just below Option Compare Database?
12. are they compiled?
13. have you done a decompile?
14. are user front ends .accde and each user has their own copy?
15. has currentdb been assigned to a database object which is referred to in code rather than currentdb
16. does the front end maintain a persistent connection with the back end? - if 15 is done right, it will
Access
17. Has name autocorrect been turned off?
18. has front end been compacted?
Network
19. does it have sufficient bandwidth for the number of users and level of traffic?
20. can bandwidth be increased?
Much of the above would need to be addressed anyway to take advantage of the performance benefits of upsizing the backend and if there is not another reason for upsizing such as db size, improved security, high volume of concurrent users.