You learn something new every day - awesome, Thanks Chris!

As always, please contact me if I can be of any futher assistance.

Gavin "Beau" Baumanis
Senior Application Developer
PalCare Pty. Ltd.

P: +61 -3 9380 3513
M: +61 -438 545 586
E: b...@palcare.com.au
W: http://palcare.com.au



On 04/10/2010, at 4:22 PM, christophe albrech wrote:

> Hi Scott,
> 
> If I may, your code could be improved performance-wise. It is a classic 
> example of Rbar programming (pronounced reebar = Row by agonizing row) as the 
> process is not written in a set-based way, which is exactly what DB servers 
> are really good (and really fast) at.
> 
> If you think about it, the code loops over each record in the first query 
> (the cfif is useless by the way) , and then does an update for each one. if 
> you have a thousand records, that's a thousand loops, a thousand queries sent 
> through the wire, a thousand query the optimizer has to parse, and so on. 
> What you really want to do is have a single update statement instead.
> 
> The problem in your case is that using aggregation forces you to use a group 
> by statement. On top of that you need the aggregated data to perform the set 
> operation which complicates the matter. While writing one single statement is 
> possible it's probably easier to read if you use a temp table to store the 
> maxed date and then write a single update. like so:
> 
> <cfquery>
> SELECT  sb_invoice.sb_invoice_id,
>         MAX(sb_claim_date) AS sb_claim_date
> INTO    ##tempTable
> FROM    sb_invoice
>         INNER JOIN sb_invoice_item ON sb_invoice.sb_invoice_id = 
> sb_invoice_item.sb_invoice_id
>         INNER JOIN sb_item_claim ON sb_invoice_item.sb_invoice_item_id = 
> sb_item_claim.sb_invoice_item_id
> WHERE   sb_invoice.sb_bill_mech_code IN ( 'M', 'F', 'AG', 'SC', 'MB', 'MO' )
>         AND sb_invoice_item.sb_item_status_code IN ( '21', '24', '31' )
> GROUP BY sb_invoice.sb_invoice_id,
>         sb_invoice.sb_reminder_date
> HAVING  sb_invoice.sb_reminder_date < DATEADD(d, 30, MAX(sb_claim_date))
> 
> UPDATE  i
> SET     sb_reminder_date = DATEADD(d, 31, t.sb_claim_date)
> FROM    sb_invoice i
>         INNER JOIN #tempTable t ON i.sb_invoice_id = t.sb_invoice_id
> </cfquery>
> 
> The more records the initial select returns, the more resources you save. I 
> just tried a simple example on my local machine where I tried to update 10k 
> rows with both methods. the rbar one took about 10 seconds while the 
> set-based one took less than half a second. trying with 100k rows, I got 70 
> seconds against 2.5.
> 
> Let's keep in mind that lots of updates wouldn't need the temp table in the 
> first place. It's only there because because you were updating with an 
> aggregated value. Normally you'd just do:
> 
> UPDATE t
> set blah = 6
> FROM myTable t
>  JOIN otherTable o on o.id = t.fk
>  ...
>  ...
> 
> Anyway, speaking of agonizing stuff, I'm off to see the dentist.
> 
> Cheers,
> 
> Tof
> 
> 
> 
> On Fri, Oct 1, 2010 at 11:30 AM, Scott Thornton 
> <scott.thorn...@hnehealth.nsw.gov.au> wrote:
> Hello,
> 
>  
> Thanks for all replies.
> 
>  
> An update of my local dev server to 9,0,1,274733 appears to have solved the 
> problem.
> 
>  
>  
>  
> From: cfaussie@googlegroups.com [mailto:cfaus...@googlegroups.com] On Behalf 
> Of Scott Thornton
> Sent: Friday, 1 October 2010 10:29 AM
> To: cfaussie@googlegroups.com
> Subject: RE: [cfaussie] Strange problem - Element RECORDCOUNT is undefined in 
> query
> 
>  
> HI All,
> 
>  
> 1. What happens if you try CFDUMP instead right after the query?
> 
>  
> using
> 
> <cfdump var="#fix_this#"><cfabort>
> 
>  
> 
> returns
> 
>  
> Variable FIX_THIS is undefined.
> 
>  
> 2. re recordcount gt 0.
> 
>  
> I didn't know that, thanks.
> 
>  
> 3.  Why the cfoutput?
> 
>  
> The original code used cfloop, I tried using cfoutput as well. Typically 
> cfloop would be used.
> 
>  
> 4. Update CF?
> 
>  
> Will try that now.
> 
>  
> 5. Does the query run (as is)?
> 
>  
> Yes it does, however it does not return any rows ( in SQl Query Analyzer 
> 2000). The database is MS SQL 2005
> 
>  
> 5. Much simplier query?
> 
>  
> <cfquery  datasource="#DSN#" name="fix_this">
> 
>                 select top 1 * from sb_invoice
> 
> </cfquery>
> 
>  
> <cfdump var="#fix_this#"><cfabort>
> 
>  
> works fine.
> 
>  
> Sooo, I will update my local server first, then put the orginal query back in 
> and see how it goes.
> 
>  
> From: cfaussie@googlegroups.com [mailto:cfaus...@googlegroups.com] On Behalf 
> Of m...@ampersand.net.au
> Sent: Friday, 1 October 2010 9:41 AM
> To: cfaussie@googlegroups.com
> Subject: Re: [cfaussie] Strange problem - Element RECORDCOUNT is undefined in 
> query
> 
>  
> What happens if you try CFDUMP instead right after the query?
> 
> On 1/10/2010 9:35 AM, Scott Thornton wrote:
> 
> Hi,
> 
>  
> Running across a odd problem in CF 9,0,0,251028. development server.
> 
>  
> I was just running a process that usually works and has not been modified for 
> quite a long time. part of that process runs a query and then loops over the 
> result set. Simple enough… however the query does not seem to exist after it 
> has run.
> 
>  
> eg: The following code returns Element RECORDCOUNT is undefined in FIX_THIS.
> 
>  
>  
> <cfquery  datasource="#DSN#" name="fix_this">
> 
>                 select sb_invoice.sb_invoice_id, sb_invoice.sb_reminder_date, 
> max(sb_claim_date) as sb_claim_date
> 
>                 from sb_invoice
> 
>                 inner join sb_invoice_item
> 
>                 on sb_invoice.sb_invoice_id = sb_invoice_item.sb_invoice_id
> 
>                 inner join sb_item_claim
> 
>                 on sb_invoice_item.sb_invoice_item_id = 
> sb_item_claim.sb_invoice_item_id
> 
>                 where sb_invoice.sb_bill_mech_code in 
> ('M','F','AG','SC','MB','MO')
> 
>                 and sb_invoice_item.sb_item_status_code in ('21','24','31')
> 
>                 group by sb_invoice.sb_invoice_id, sb_invoice.sb_reminder_date
> 
>                 having sb_invoice.sb_reminder_date < 
> DateAdd(d,30,max(sb_claim_date))
> 
> </cfquery>
> 
>  
> <cfif fix_this.recordcount gt 0>
> 
>  
>                 <cfoutput query="fix_this">
> 
>                 
>                                 <cfquery name="upd_fund_reminder" 
> datasource="#DSN#">
> 
>                                                 update sb_invoice
> 
>                                                 set sb_reminder_date = 
> <cfqueryparam cfsqltype="cf_sql_varchar" 
> value="#DateFormat(DateAdd("d",31,fix_this.sb_claim_date),"dd-mmm-yyyy")#">
> 
>                                                 where sb_invoice_id = 
> <cfqueryparam cfsqltype="cf_sql_numeric" value="#fix_this.sb_invoice_id#">
> 
>                                 </cfquery>
> 
>                                 
>                 </cfoutput>
> 
>  
> </cfif>
> 
>  
> I have changed the name of the query to a few different values, I have used 
> cfloop instead of cfoutput, I added the cfif.recordcount to see if that 
> helped, to no avail. Without the CFIF the error was :
> 
> Attribute validation error for tag cfoutput.
> 
>  
> The value of the attribute query, which is currently fix_this, is invalid.
> 
>  
>  
> Debug output shows that the query executed in 922ms and returned no rows.
> 
>  
> What am I missing?
> 
>  
> -- 
> You received this message because you are subscribed to the Google Groups 
> "cfaussie" group.
> To post to this group, send email to cfaus...@googlegroups.com.
> To unsubscribe from this group, send email to 
> cfaussie+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/cfaussie?hl=en.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "cfaussie" group.
> To post to this group, send email to cfaus...@googlegroups.com.
> To unsubscribe from this group, send email to 
> cfaussie+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/cfaussie?hl=en.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "cfaussie" group.
> To post to this group, send email to cfaus...@googlegroups.com.
> To unsubscribe from this group, send email to 
> cfaussie+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/cfaussie?hl=en.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "cfaussie" group.
> To post to this group, send email to cfaus...@googlegroups.com.
> To unsubscribe from this group, send email to 
> cfaussie+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/cfaussie?hl=en.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "cfaussie" group.
> To post to this group, send email to cfaus...@googlegroups.com.
> To unsubscribe from this group, send email to 
> cfaussie+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/cfaussie?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"cfaussie" group.
To post to this group, send email to cfaus...@googlegroups.com.
To unsubscribe from this group, send email to 
cfaussie+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/cfaussie?hl=en.

Reply via email to