Rhino, Thanks for the help and time! Actually, I thought the same thing, but what's weird is that is the only thing that doesn't slow it down. If I take out all of the join clauses EXCEPT that one the query runs virtually instantaneously. for some reason it will use the index in that case and it works. If I take out everything like this:
SELECT a.IdAppt, a.IdPatient, p.NameLast, p.NameFirst, p.NameMI from Appt_ a LEFT JOIN patient_ p ON a.IdPatient = p.IdPatient WHERE a.ApptDate >= '2009-03-01'; It is still utterly slow. EXPLAIN looks like this: +----+-------------+-------+-------+---------------+----------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+--------+-------------+ | 1 | SIMPLE | a | range | apptdate | apptdate | 4 | NULL | 296166 | Using where | | 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 262465 | | +----+-------------+-------+-------+---------------+----------+---------+------+--------+-------------+ But, very good try. I thought this might be it as well. Thanks, Jim McNeely On Mar 10, 2011, at 9:05 AM, Rhino wrote: > > What I'm about to say may be completely out to lunch so don't be afraid to > dismiss it. I'm more a DB2 guy than a MySQL guy and I'm getting rusty on both > but I've always been struck by how similar the two dtabases are. Therefore, I > want to offer an insight on why this query would not perform terribly well in > DB2. I simply don't know if it is applicable to MySQL. > > In DB2, using functions on predicates (conditions in a WHERE clause), > prevents DB2 from using an index to satisfy that predicate. (Or at least it > used to: I'm not certain if that has been remedied in recent versions of the > DB2 optimizer.) Therefore, the CONCAT() function in the line > "AND CONCAT(a.IdAppt, '0') = c.IdApptType" would ensure that no index on the > IdAppt column would be used to find the rows of the table that satisfied that > condition. > > My suggestion is that you try rewriting that condition to avoid using > CONCAT() - or any other function - and see if that helps the performance of > your query. That would require modifying your data to append a zero to the > end of the existing date in IdApptType column, which may or may not be a > reasonable thing to do. You'll have to decide about that. > > Again, I could be all wet here so don't have me killed if I'm wrong about > this :-) I'm just trying to help ;-) > > -- > Rhino > > On 2011-03-10 11:38, Jim McNeely wrote: >> Shawn, >> >> Thanks for the great help! It still is not working. I did an EXPLAIN on this >> query with your amended split out join statements and got this: >> >> +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ >> | id | select_type | table | type | possible_keys | key | key_len | >> ref | rows | Extra | >> +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ >> | 1 | SIMPLE | a | range | apptdate | apptdate | 4 | >> NULL | 296148 | Using where | >> | 1 | SIMPLE | p | ALL | NULL | NULL | NULL | >> NULL | 262462 | | >> | 1 | SIMPLE | t | ALL | NULL | NULL | NULL | >> NULL | 311152 | | >> | 1 | SIMPLE | c | ref | IdApptType | IdApptType | 51 | >> func | 1 | | >> | 1 | SIMPLE | af | ALL | NULL | NULL | NULL | >> NULL | 5680 | | >> +----+-------------+-------+-------+---------------+------------+---------+------+--------+-------------+ >> >> What I'm not catching is why it says there is no key it can use for the >> patient table; here is a portion of the show create: >> >> PRIMARY KEY (`zzk`), >> KEY `IdPatient` (`IdPatient`), >> KEY `SSN` (`SSN`), >> KEY `IdLastword` (`IdLastword`), >> KEY `DOB` (`DateOfBirth`), >> KEY `NameFirst` (`NameFirst`), >> KEY `NameLast` (`NameLast`) >> >> So, the IdPatient is at least a POSSIBLE key, right? >> >> On Mar 9, 2011, at 8:34 PM, Shawn Green (MySQL) wrote: >> >>> Hi Jim, >>> >>> On 3/9/2011 17:57, Jim McNeely wrote: >>>> I am trying to set up an export query which is executing very slowly, and >>>> I was hoping I could get some help. Here is the query: >>>> >>>> SELECT a.IdAppt, a.IdPatient, >>>> p.NameLast, p.NameFirst, p.NameMI, >>>> a.IdProcedure, a.ProcName, CAST(CONCAT(a.ApptDate, " ", a.ApptTimeOut) AS >>>> CHAR) >>>> ApptDateTime, a.ApptLenMin Duration, >>>> a.Room Primary_Resource_ID, 'R' as Primary_Resource_Type, >>>> t.Note, c.IdPractAffil DoctorID, af.PractName DoctorName, a.ICD9code ICD9, >>>> '??????' Diagnosis_free_test >>>> >>>> from Appt_ a LEFT JOIN (patient_ p, today_ t, Copy_ c, Affil_ af) >>>> ON (a.IdPatient = p.IdPatient >>>> AND a.IdPatientDate = t.IdPatientDate >>>> AND CONCAT(a.IdAppt, '0') = c.IdApptType >>>> AND a.IdPriCarePhy = af.IdAffil) >>>> WHERE a.ApptDate>= '2009-03-01'; >>>> >>>> p.IdPatient, t.IdPatientDate, c.IdApptType, and af.IdAffil are all >>>> indexed. Also I selectively took out join parameters until there was >>>> nothing but a join on the patient table, and it was still slow, but when I >>>> took that out, the query was extremely fast. What might I be doing wrong? >>>> >>>> Thanks, >>>> >>>> Jim McNeely >>> The performance problem is with your Cartesian product. I think you meant >>> to write: >>> >>> from Appt_ a >>> LEFT JOIN patient_ p >>> ON a.IdPatient = p.IdPatient >>> LEFT JOIN today_ t >>> ON a.IdPatientDate = t.IdPatientDate >>> LEFT JOIN Copy_ c >>> ON CONCAT(a.IdAppt, '0') = c.IdApptType >>> LEFT JOIN Affil_ af >>> ON a.IdPriCarePhy = af.IdAffil >>> >>> As of 5.0.12, the comma operator for table joins was demoted in the 'order >>> of precedence' for query execution. That means that MySQL became more >>> complaint with the SQL standard but it also means that using a comma-join >>> instead of an explicit ANSI join can result in a Cartesian product more >>> frequently. >>> >>> Try my style and compare how it works. If both styles are similarly slow, >>> collect the EXPLAIN plan for this query and share with the list. >>> >>> Yours, >>> -- >>> Shawn Green >>> MySQL Principal Technical Support Engineer >>> Oracle USA, Inc. - Hardware and Software, Engineered to Work Together. >>> Office: Blountville, TN >>> >>> -- >>> MySQL General Mailing List >>> For list archives: http://lists.mysql.com/mysql >>> To unsubscribe: >>> http://lists.mysql.com/mysql?unsub=j...@newcenturydata.com >>> >>