Thanks for the responses to everyone! Here is the result for the explains.

============view query=============
explain select * from admin_exam_view where dateexam = '2012-08-13';
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+
| id | select_type | table | type | possible_keys   | key        | key_len | 
ref                        | rows   | Extra       |
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+
|  1 | SIMPLE      | p     | ALL  | DOB             | NULL       | NULL    | 
NULL                       | 281123 | Using where |
|  1 | SIMPLE      | e     | ref  | IdPatient       | IdPatient  | 99      | 
RIS_archive.p.IdPatient    |      6 | Using where |
|  1 | SIMPLE      | ec    | ref  | Quantity,IdExam | IdExam     | 138     | 
RIS_archive.e.IdExam       |      3 |             |
|  1 | SIMPLE      | c     | ref  | IdApptType      | IdApptType | 51      | 
func                       |      1 |             |
|  1 | SIMPLE      | a     | ref  | IdAppt          | IdAppt     | 99      | 
RIS_archive.e.IdAppt       |      1 | Using where |
|  1 | SIMPLE      | af    | ref  | IdAffil         | IdAffil    | 93      | 
RIS_archive.c.IdPractAffil |      1 |             |
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+

=============direct query=============
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+
| id | select_type | table | type | possible_keys                  | key        
| key_len | ref                        | rows   | Extra       |
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+
|  1 | SIMPLE      | p     | ALL  | IdPatient_UNIQUE,IdPatient,DOB | NULL       
| NULL    | NULL                       | 281123 | Using where |
|  1 | SIMPLE      | e     | ref  | IdPatient,statusnumber,IdAppt  | IdPatient  
| 99      | RIS_archive.p.IdPatient    |      6 | Using where |
|  1 | SIMPLE      | a     | ref  | PRIMARY,zzk,IdAppt             | IdAppt     
| 99      | RIS_archive.e.IdAppt       |      1 | Using where |
|  1 | SIMPLE      | ec    | ref  | Quantity,IdExam                | IdExam     
| 138     | RIS_archive.e.IdExam       |      3 |             |
|  1 | SIMPLE      | c     | ref  | IdApptType                     | IdApptType 
| 51      | func                       |      1 |             |
|  1 | SIMPLE      | af    | ref  | IdAffil                        | IdAffil    
| 93      | RIS_archive.c.IdPractAffil |      1 |             |
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+

I can't tell any practical difference between the two. 

Jim McNeely

On Aug 23, 2012, at 12:39 PM, Shawn Green wrote:

> On 8/23/2012 2:30 PM, James W. McNeely wrote:
>> I am working on a view based on this query:
>> 
>> =======================================
>> SELECT
>> -- Patient Info
>> p.IdPatient,
>> p.IdLastword MRN,
>> p.NameLast,
>> p.NameFirst,
>> p.Addr1,
>> p.Addr2,
>> p.AddrCity,
>> p.AddrState,
>> p.AddrZip,
>> p.Gender,
>> p.DateOfBirth,
>> -- Provider Info
>> af.IdAffil,
>> af.PractName,
>> af.OfficeName,
>> -- Exam Info
>> e.IdExam,
>> e.dateexam,
>> a.WorkArea dept,
>> a.Room location,
>> e.ProcModeCode,
>> e.ProcName,
>> e.IdRefSite,
>> ec.IdCPT,
>> e.zzk exam_zzk,
>> ec.zzk examcpt_zzk
>> FROM patient_ p
>> LEFT JOIN exams e ON e.IdPatient = p.IdPatient
>> LEFT JOIN Examcpt_ ec ON (e.IdExam = ec.IdExam AND '1' = Quantity)
>> LEFT JOIN Copy_ c ON CONCAT(e.IdAppt , '0') = c.IdApptType
>> LEFT JOIN Appt_ a ON e.IdAppt = a.IdAppt
>> LEFT JOIN Affil_ af ON c.IdPractAffil = af.IdAffil
>> WHERE
>> p.AddrState = 'WA'
>> AND e.statusnumber = '4'
>> AND e.IdRefSite <> 'S50'
>> AND e.IdRefSite <> 'S51'
>> AND e.IdREfSite <> 'S63'
>> AND p.DateOfBirth < DATE_ADD(CURDATE(), INTERVAL '-2' MONTH)
>> AND a.zzk IS NOT NULL
>> ============================================
>> 
>> If I run this query itself (not in the view), and add this:
>> 
>> AND e.dateexam = '2012-08-13'
>> 
>> it runs like lightning, super fast. But if I run the query against the view, 
>> for example "SELECT * FROM exam_view WHERE dateexam = '2012-08-13'
>> 
>> It is so glacially slow that I end up having to kill the query. What is 
>> going on, and how can I fix this?
>> 
> 
> Look at the two EXPLAINs. I believe that when you run the query directly, you 
> get to optimize that term into the execution of the view. When you run it 
> through the view, the ALGORITHM is set to force the view to materialize all 
> of the rows in the query, then scan those to find the rows that match your 
> condition.
> 
> When you execute the query manually, you are getting the benefits of 
> peformance as you would have for ALGORITHM=MERGE in the VIEW. However since 
> you are not getting those benefits, it looks like you are in an 
> ALGORITHM=TEMPTABLE situation.
> 
> http://dev.mysql.com/doc/refman/5.5/en/view-algorithms.html
> 
> The explain plans will clearly show which situation you are in.
> -- 
> 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
> 

Reply via email to