I will assume JET 4/ACE (Access 2000 or later) back end:
For Access Forms and Reports, you have several options for setting the Record Source property.
1) A saved query is optimized when it is saved. It will not need to be optimized again. This has a performance gain.
2) (recommend method if possible) Embedded a SQL string in the record source of a form or report. This is also stored as a temp query so the above applies.
3) Build the SQL in VBA code as a string, not modifying the QueryDef(). While it is true the VBA code might get compiled, the SQL is still just in a string. When the SQL is executed it must go through the optimizer EVERY time. This lowers the performance when compared to the previous two options where the query gets optimized and then saved.
Now let's compare options #1 and #2.
Pros of Option 1:
If you store the query then it can be shared with other objects. For example, multiple reports can share the same saved/named) query but have different grouping and sorting.
Pros of Option 2 :
When the SQL is stored in the record source of a form or report, it protects the query when the database is compiled into an MDE/ACCDE.
Pros for Option 3:
There are times when you must build the SQL on the fly using VBA code. I will take a slight performance hit to gain the desired functionality. I will use this in special cases but not as a standard method.
I would recommend setting a Form's and Report's record source to an embedded SQL string (Option #2) whenever possible. I find this keeps things more organized. When you look at the query list in the Navigation pane or Database Container you will have a whole lot fewer queries to sort through to find the one you need.