| re: Large table/slow query/ can performance be improved?
As long as you're not using any client-side functions (Access or user-defined),
you should be able to make this into a Pass-Through query.
1) Copy the SQL Statement to the clipboard (or better yet, to Notepad)
2) In Access, make a new query, but don't choose any tables.
3) Choose Query/SQL Specific>Pass-Through
4) Paste the SQL Statement in there
5) Choose View/Properties
6) Set the Connect string (and ODBC Timeout!) appropriately
Run the query.
I have never seen an Access query take 6 hours to run...and I have an Access
database linked to over 68 MILLION records. Admittedly, I would never even WAIT
that long to find out if it could ever complete!
The slowest Access queries I've seen are the ones that I call "Query of a query
of a query...etc." with all records included the whole time, and a criteria at
the end; especially if Access or user-defined (VBA) function are invovled!
You really should learn the advantages of SQL Server's "SQL langauange" vs
Access. My favorite example is the FULL OUTER JOIN...with one statement in SQL
Server you get both sets of records from the eaither side of join whether or
not they match...can't do that in Access without making three queries! (OUTER,
Non-Match OUTER, then UNION)
Althogh the IIF in Access is convenient, it insists on evaluating both
outcomes...SQL Server's "CASE" construct makes much more sense.
If your query DOES use Access and/or user-defined VBA Functions, then you
should have the whole process converted to a stored procedure, and the use a
Pass-Through query to call the Stored Procedure. In all seriousness, EVERY
query you need should be converted to paramaterized Stored Procedures, and
called via Pass-Through....this is the best way to optimize performance.
CAVEAT: Pass-Through queries cannot be used as record sources for
linkchild/master situations (That's a JET-only feature), but you can always
program the same functionality yourself!
I'd be interested in seeing the SQL Statement of the 6-hr query. |