Karen - wild thought. Would a compound index work here? CREATE INDEX LoopTroubles (PolicyID,AgentNo,Policy,CovCode)
This would enable an index only retrieval. Albert > On Apr 24, 2017, at 8:26 AM, karentellef via RBASE-L > <rbase-l@googlegroups.com> wrote: > > Dan: > > I had actually posted here on the list a few years ago when, as the business > grew, our cursor (which used to process about 25K rows) started randomly > crashing in the 30K or 40K range. Several people here recommended to replace > the while loop with goto/label, so that's what I did. The goto works fine, > so I'm not interested in revisiting a while loop. > > I'm not understanding what you're suggesting on a temp table. I would have > to create a temp table that would hold probably 30K rows, and my "select > into" would simply operate against a temp table rather than the permanent > table. Are you saying selecting against a temp table would be faster than a > permanent table? > > One thing that I've asked permission to try -- that is to avoid a "declare > cursor" altogether, which puts an hours-long "cursor lock" against a very > heavily used table. > I'm thinking I could create a 40K row temp table with the policyID I'm to > process (the PK), with an autonumber column, such as: > 1111 1 > 1222 2 > 3535 3 > > Then using my goto/label block, I could (just quick code here, not 100% right) > set var vcount int = 1 > label top > select policyid into vid from temptable where autonumbercol = .vcount > if vid is null then ; quit ; return > select .... into ..... from policytable where policyid = .vid (this > replaces the "fetch") > -- do all the "cursor" loop stuff > set var vcount = (.vcount + 1) > goto top > > I don't know if this will speed up the code, but it prevents the routine from > putting ANY locks on the main table. > > Karen > > > > -----Original Message----- > From: Dan Goldberg <d...@lancecamper.com> > To: rbase-l <rbase-l@googlegroups.com> > Sent: Mon, Apr 24, 2017 8:34 am > Subject: RE: [RBASE-L] - Thoughts on speeding up a cursor? > > I would find out why the while loop never completes. I have 9 level while > loops for my BOM to break down the assemblies into a parts list that runs > every night and it always runs. > > There are many tricks on speeding up processing. Sometimes using temp tables > to reduce the amount of items in the where clause usually speeds things up. > This is only one of them I use. > > Example, maybe use a temp table for the select statement below. I am assuming > the select statement runs many times. > > --create temp table to hold values filtering out the standard items > Create temp table tmpagtcomm (agentno integer, policy_no text, covcode > integer) > Insert into tmpagtcomm select agentno, policy_no, covcode from agtcomm where > polyr = 1 and agtcomm < 0 and paidtoagton is not null > > > --While loop > SELECT agtcomm INTO vtestagtcomm + > FROM tmpagtcomm + > WHERE agentno = .vagentno AND policy_no = .vpolicy_no + > AND covcode = .vcovcode > > This way it is not looking at all the where parameters which might slow it > down. > > Not sure if this helps. I usually trace it as well to see what is slowing it > down. > > > Dan Goldberg > > > > From: karentellef via RBASE-L [mailto:rbase-l@googlegroups.com > <mailto:rbase-l@googlegroups.com?>] > Sent: Monday, April 24, 2017 6:14 AM > To: rbase-l@googlegroups.com <mailto:l...@googlegroups.com> > Subject: [RBASE-L] - Thoughts on speeding up a cursor? > > I inherited a monster program. It's 800 physical lines of code, separated > like this: > > 100 lines of pre-processing code before we set a cursor > > 600 lines of code that are within a DECLARE CURSOR that processes 40,000 > records. We cannot use a "while" loop because it never completed, so we use > a "goto / label" structure to move around, and it always completes fine. > > 100 lines of post-cursor code. > > > I am trying to speed up this cursor as it now takes hours to process. There > are no "run" statements within this program, no printing of reports other > than post-cursor. > > Within that cursor loop, there are many "goto" statements to move around > within that cursor loop. > My assumption: when the program hits a "goto" command, it must run through > every line of code, one line at a time, to find the "label". It would go all > the way to the end of the program, and if it cannot find the label, it then > goes back up to line 1 of the program and scans every line until it finally > hits the label. In this program, sometimes these labels are after the goto, > sometimes they are "above" it. > > So question 1: is my assumption correct? > > If it is: Let's say for readability that a line has been separated into > multiple lines, such as this: > SELECT agtcomm INTO vtestagtcomm + > FROM agtcomm + > WHERE agentno = .vagentno AND policy_no = .vpolicy_no + > AND covcode = .vcovcode AND polyr = 1 AND agtcomm < 0 + > AND paidtoagton IS NOT NULL > > > As it searches for a matching "label", is RBase evaluating 5 lines of code, > one at a time? Or is it "smart" enough to know it's one command and > evaluates it just once? > > So IOW: if I was to retype this command so that it takes just one really long > line, or maybe just 2 lines, would it be "quicker" for RBase to search for a > label? I wouldn't normally be so anal about it, but when you're doing this > 40,000 times..... > > > Karen > > > > > -- > You received this message because you are subscribed to the Google Groups > "RBASE-L" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to rbase-l+unsubscr...@googlegroups.com > <mailto:rbase-l+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. > -- > You received this message because you are subscribed to the Google Groups > "RBASE-L" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to rbase-l+unsubscr...@googlegroups.com > <mailto:rbase-l+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. > > -- > You received this message because you are subscribed to the Google Groups > "RBASE-L" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to rbase-l+unsubscr...@googlegroups.com > <mailto:rbase-l+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "RBASE-L" group. To unsubscribe from this group and stop receiving emails from it, send an email to rbase-l+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.