"Best" is a tricky concept. It depends a great deal on what you are doing.
From a performance standpoint, there is little difference. Both kinds of
queries are optimized by the Jet engine. This was not always the case, but
it has been since Access 97.
I often programmatically create queries that forms or reports are based on.
In that case it is easier to base the form on a saved query. You can just
save the new query and open the form or report. Of course, it is also
possible to open the form first and set the RecordSource to an SQL
statement, so either will work. I just prefer the former.
There can be some concern about a user getting to the Database Window and
deleting queries that your form is based on. It can lose its record source.
They can do this even if you make it an MDE. So if you use a query as the
recordsource and make it an MDE, you can protect your forms from this.