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
>>> 
>> 

Reply via email to