| 
	
 | 
 Posted by Erland Sommarskog on 02/04/07 23:38 
HC (hboothe@gte.net) writes: 
> select tMO.* from caredata.dbo.tbl_medications as tM inner join 
> caredata_aa.dbo.tbl_medicationorders as tMO on tMO.medid = tM.pkey 
> where tMO.resid = 43 
>  
> the join clause tMO.medid is matched against the primary key of the tM 
> table.  There is no index for tMO.medid, nor is there one for 
> tMO.resid.  Would it help to index them since the Clustered Index Seek 
> is being performed against the tbl_Medications table?   
 
There should be an index in resid. If the major part of the queries 
against tbl_medicationorders are against resid, then it's probably a  
good idea to cluster on this column. (You would then have to drop  
the primary key, and the reapply it as nonclustered.) 
 
> In my program I do a LEFT OUTER JOIN instead of an INNER JOIN, but the 
> performance is the same: slow.  So, I just left it at an INNER JOIN to 
> try to keep things simple.  
 
Well, since you only return data from tMO, this may be even better: 
 
    SELECT tMO.* 
    FROM   caredata_aa.dbo.tbl_medicationorders tNO 
    WHERE  tMO.resid = 43 
      AND  EXISTS (SELECT * 
                   FROM   caredata.dbo.tbl_medications tM 
                   WHERE  tMO.medid = tM.pkey) 
 
Not that it is likely to affect performance, but you would avoid 
returning the same row twice from meditioncationorders. 
 
> I ran the query as you asked, against both database engines and have 
> posted them online.  I was having problems with my regular website so 
> I had to cobble one together for this purpose.  It was done through a 
> web-interface so I just UUE encoded a ZIP file of the text file with 
> the results.  Each db engine's results are in a different file.  I 
> included the query (as seen above), and the statistics.  You can find 
> them here: http://home.earthlink.net/~hboothe/  On that lame page 
> you'll see links on the left side for the pages dealing with each db 
> engine. 
 
I'm afraid that they appear as somewhat cryptic to me. I guess that I  
could copy them into a text editor and try to decode them, but I'm 
lazy. Couldn't you just upload the output as text files there. 
 
> The 14 second process I refer to (that takes over 4 minutes on 
> Express) is using the same tables.  What I am trying to do is to pare 
> this stuff down to the smallest piece that exhibits the unwanted 
> behavior so that the situation is not obfuscated unnecessarily.  I 
> think that once the problem with the little query is fixed, the 
> problem with the big query will be fixed.  The process that takes 14 
> seconds on these little tables in MSDE and over 4 minutes in Express 
> is nasty.  I have multiple databases.  One database is the parent of 
> the whole system, containing information that is relevant across each 
> of the other databases.  You may notice in the query I've posted that 
> the tMO table is from one db (caredata_aa.dbo.tbl_MedicationOrders) 
> and tM is from another (caredata.dbo.tbl_Medications).  My program 
> (system) can support many of the _aa databases (_aa, _ab, _ac, etc.). 
> The process that takes 14 seconds on MSDE is supposed to report to the 
> users those medications that are not in use by any medication order in 
> any of the databases (so, no match from tM.pkey to tMO.medid from any 
> tMO of which there may be as many as 4 (maximum number currently 
> used)).  Each record must not match across each of multiple db's. 
 
Ehum, this design sounds dubious. I get the impression that if this was  
all in the same database, and the same tables, this could be done in a 
single query. 
 
Or is there any particular reason you have multiple databases? 
 
Anyway, it occurred to me, there is one thing to check for. Run this query: 
 
   select name from sys.databases where is_auto_close_on = 1 
 
For all databses that appear do: 
 
   ALTER DATABASE db SET AUTO_CLOSE OFF 
 
 
 
 
--  
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se 
 
Books Online for SQL Server 2005 at 
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx 
Books Online for SQL Server 2000 at 
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx
 
  
Navigation:
[Reply to this message] 
 |