I am using SQL as a backend and access as a front end. In general, does using a query to filter data for a form negate some of the speed and performance of SQL?
Access makes every attempt to "pass through" all queries. That doesn't mean that you can't prevent Access from passing through your query. you need to understand a little about how Access and ODBC work.
Creating a pass through query and saving it as a querydef is of course the most efficient since Access bypasses ODBC in this case. Otherwise, you have the overhead of the querydef being pre-processed by ODBC. Doesn't mean the query won't be handled exactly as the pass through query was. It just means you have a small amount of overhead for the ODBC code to run. In exchange for this very small hit, you end up with an updateable recordset that you can bind to a form so you can use Access much the same way you always used Access. (you can't use pass through queries in subforms).
HOWEVER, you are still responsible for making your queries as efficient as possible. The old style Access technique which you see everywhere in all the MS samples, is to bind a form to a table and filter the local recordset using the built in form tools. If the table is 100 rows, it makes absolutely NO difference what you do. But, the larger your table gets, the higher the price you will pay for this method. You actually want the server to do the heavy lifting and by that, we mean use criteria passed to it to select the smallest number of records and columns as possible to minimize the data transferred over the LAN. Therefore, all your forms should be bound to queries that have WHERE clauses that severely limit the number of rows returned. Preferably, edit forms would retrieve only a single record to edit. Subforms are constrained by the main form criteria so they may contain many records. In most cases, I use a couple of textboxes or combos in the header of my edit forms. So, the form always opens empty because the query returns no records.
Select ... From MyTable Where fld1 = Forms!myform!fld1;
Then when the user enters a value in the search field, the code does a requery:
Me.Requery
To run the query again and return the record. If there are several search options, I use a button to do the Requery but if there is only one, I use the AfterUpdate event so the Requery runs when the user tabs out of the search field.
My introduction to Access was at Reader's Digest in the early 90's where I was asked to do a project that required retrieving data from their mainframe DB2 database (IBM). What an eyeopener this was for me the old COBOL programmer. I fell in love instantly. I could now retrieve data from the database on the IBM mainframe AND UPDATE it if I needed to. I switched immediately to becoming an Access expert and the vast majority of my applications written since the early 90's have used SQL Server, Oracle, DB2, Sybase, you name it, as BE's. I used whatever RDBMS the client's other applications were using (DB2 is still my favorite though). Occasionally, I used Jet/ACE but I always built my Jet/ACE apps using exactly the same techniques I used for my ODBC apps.
My apps always use bound forms. Occasionally, I use an unbound form to display search results, especially if they are very complicated. I always use linked tables and querydefs. The only time I use embedded SQL is if the SQL is dynamic. Otherwise, the querydefs just take parameters. Occasionally, I use a view to speed up a join that is frequently used. The view allows SQL Server to calculate an execution plan and save it so it cuts overhead. Otherwise the execution plan must be calculated for each query sent to the server, even a pass through unless it is executing a stored procedure). For some bulk updates (especially deletes), I create pass through queries because they will run outside of Access' transaction umbrella. You know how when you run an Action query, Access always tells you something like, "you are about to delete 5893 records. Do you want to continue?" That is your clue the the delete is happening inside a transaction. This adds overhead. If you use a pass through query, it just runs and you don't get a second chance to change your mind. And finally, every once in a while I have a report that is so complex and requires so many tables and joins that a stored procedure is called for.
So, start by assuming your querydefs and bound forms will work with acceptable speed (assuming you understand how to not interfere with Access passing through your query) and then deal with slowness on a case by case basis.