Re: SDriverOracle OffesetStrategy
anthony berglas <[email protected]> Tue, 5 Feb 2013 09:40:39 +1000
| Newsgroups | gmane.comp.java.orm.simpleorm |
|---|---|
| Message-ID | <CA+_PZMdbn7-9t1G6rCkXgaSxob7Orm_P1_2Xera6HocihwZJUw@mail.gmail.com> |
--f46d04479f9541c7ad04d4eea1ba Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Again well done. Again, it amazes me after all these years that Oracle does not support these facilities more easily. Why put up a barrier for people to migrate to Oracle! Anthony On Tue, Feb 5, 2013 at 4:01 AM, Franck Routier <[email protected]>wr= ote: > Hi, > > this has been a long process... but I finally implemented a QUERY > OffsetStrategy for SDriverOracle that uses Oracle's native rownum idiom. > I had to slightly modify the signature of the limitSQL() method, but this > was worth the effort: > I have a real life example where I read 1 million rows with a 15000 limit > size, do some deduplication, and insert into another table. > Before this modification, it took 54 minutes on Postgresql (on a slightly > slower server), but 2 hours and 25 minutes on Oracle (and even 2h38 witho= ut > batch updates)... > Query time was getting longer and longer as the offset increased... > > After the modification, Oracle takes only 43 minutes ! > > Comments are welcome, > > Franck > > > Le 03/10/2010 02:20, [email protected] a =E9crit : > > > > Hello Franck, > > It amazes me that Oracle does not support scrollable cursors in the > database, but there you are. Could you please add a short comment to the > change explaining why you did it. > > There never has been a standard way to do this in traditional SQL. The > Oracle ROWNUM is actually more general than than Limit/Offset -- eg. you > could retrieve every 10th row for sampling, or use it to detect duplicate > rows, pick the "best" etc. If someone is interested it would not be that > hard to wrap our queries with SELECT * FROM <original query> WHERE > ROWNUM.... However, it would not be trivial. > > SQL 2003 implements a very magic CURRENT_ROW() function which is supporte= d > by Oracle and MSSQL, but not much else that I can tell. I would avoid it = as > it is complex and therefore more likely to have issues. (It is amazing th= at > the incredibly complex SQL 92 & 99 did not address these very basic issue= s!) > > (Before MSSQL introduced CURRENT_ROW it was just about impossible to get > at any row number, eg. to remove duplicate rows.) > > Thanks for the fix, > > Anthony > > At 02:21 AM 2/10/2010, Franck Routier wrote: > > > > > >I have set SDriverOracle offsetStrategy to SCAN, ie let Simpleorm drop > >records we want to skip. Anyway, this is already what Oracle driver is > >doing (but instead of dropping the records, it keeps them in a cache > >that eats all memory...). > > > >At least, this will always work. > > > >Franck > > > >Le vendredi 01 octobre 2010 =C3 15:42 +0200, Franck Routier a =C3=A9crit= : > >> > >> Yes, I also found this : > >> > >> < > http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternativ= e-to-the-mysql-limit-keyword > > > http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternativ= e-to-the-mysql-limit-keyword > >> > >> Oracle seems to be one of the worse database regarding this issue. > >> But the rownum path is not easy in Simpleorm, as it won't fit in the > >> sql > >> structure that we rely on... > >> > >> Le vendredi 01 octobre 2010 =C3 15:01 +0200, Noel Grandin a =C3=A9crit= : > >> > > >> > these 2 links have some solutions: > >> > > >> > <http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/= > > http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/ > >> > http://www.delphifaq.com/faq/databases/oracle/f594.shtml > >> > > >> > the basic syntax looks like this: > >> > > >> > select * > >> > from ( > >> > select rownum rnum, a.* > >> > from (your_query) a > >> > where rownum <=3D :M ) > >> > where rnum >=3D :N; > >> > > >> > in order to get rows n through m from 'your query.' > >> > > >> > -- Noel. > >> > > >> > Franck Routier wrote: > >> > > > >> > > > >> > > Seems I spoke too quickly. Oracle does not seem to support the > >> ansi > >> > > (2008) "OFFSET x FETCH y ROWS" syntax, nor any proprietary syntax > >> to > >> > > do > >> > > that... > >> > > > >> > > Le vendredi 01 octobre 2010 =C3 13:55 +0200, Franck Routier a > >> =C3=A9crit : > >> > > > > >> > > > Hi, > >> > > > > >> > > > I am bitten by an oom exception using offset/limit with > >> > > SDriverOracle. > >> > > > The driver uses SDriver.OffsetStrategy.JDBC. The was done > >> assuming > >> > > > (from > >> > > > various reading but without any evidence) that the Oracle Driver > >> > > was > >> > > > smart enought to use a cursor on the server side to handle this. > >> > > > > >> > > > But I definitely get an oom caused by OracleResultCacheImpl > >> eating > >> > > all > >> > > > memory. > >> > > > > >> > > > So I searched again and found this, on > >> > > > > >> > > > >> < > http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm= #CIHCHBJB > > > http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm= #CIHCHBJB > >> > > > > >> > > > "Oracle JDBC Implementation for Result Set Scrollability > >> > > > > >> > > > Because the underlying server does not support scrollable > >> cursors, > >> > > > (sic!) Oracle JDBC must implement scrollability in a separate > >> > > layer. > >> > > > > >> > > > It is important to be aware that this is accomplished by using a > >> > > > client-side memory cache to store rows of a scrollable result > >> set. > >> > > > > >> > > > Important: > >> > > > Because all rows of any scrollable result set are stored in the > >> > > > client-side cache, a situation where the result set contains > >> many > >> > > > rows, > >> > > > many columns, or very large columns might cause the client-side > >> > > Java > >> > > > Virtual Machine (JVM) to fail. Do not specify scrollability for > >> a > >> > > > large > >> > > > result set." > >> > > > > >> > > > So it seems that Oracle is not any smarter than Postgresql is, > >> and > >> > > > that > >> > > > resorting to a limit clause in the sql > >> > > (SDriver.OffsetStrategy.QUERY) > >> > > > would be a better solution for Oracle as well. > >> > > > > >> > > > So I propose to change the SDriverOracle to implement this > >> > > strategy. > >> > > > Does it sound ok ? > >> > > > > >> > > > Franck > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > -- > >> > > Franck Routier > >> > > Logo Ax=C3=A8ge > >> > > Ax=C3=A8ge > >> > > 23,rue Saint-Simon > >> > > 63000 Clermont-Ferrand > >> > > T=C3=A9l: +33 (0)4 63 05 95 40 > >> > > Fax: +33 (0)4 73 70 65 29 > >> > > Email: <mailto:franck.routier%40axege.com><franck.routier%40axege.= com> > [email protected] > >> > > > >> > > > >> > > > >> > > > >> > > >> > > >> > > >> > > >> > __________________________________________________________ > >> > Disclaimer: <http://www.peralex.com/disclaimer.html> > http://www.peralex.com/disclaimer.html > >> > > >> > > >> > > >> > > >> > > >> > >> -- > >> Franck Routier > >> Logo Ax=C3=A8ge > >> Ax=C3=A8ge > >> 23,rue Saint-Simon > >> 63000 Clermont-Ferrand > >> T=C3=A9l: +33 (0)4 63 05 95 40 > >> Fax: +33 (0)4 73 70 65 29 > >> Email: <mailto:franck.routier%40axege.com> <franck.routier%40axege.com= > > [email protected] > >> > >> > >> > >> > >> > > > >-- > >Franck Routier > >Logo Ax=C3=A8ge > >Ax=C3=A8ge > >23,rue Saint-Simon > >63000 Clermont-Ferrand > >T=C3=A9l: +33 (0)4 63 05 95 40 > >Fax: +33 (0)4 73 70 65 29 > >Email: <mailto:franck.routier%40axege.com> <franck.routier%40axege.com> > [email protected] > > > > > > Spreadsheet Detective, > Southern Cross Software Queensland Pty Limited > 54 Gerler Street > Bardon, Queensland 4065, Australia. > > Email: [email protected] > www.SpreadsheetDetective.com > Ph: +61 427 830248 (Australian Eastern Standard Time) > > "If the model seems correct only because the numbers look right, > then why build the model in the first place?" > > > --=20 Dr Anthony Berglas, [email protected] Mobile: +61 4 4838 8874 Just because it is possible to push twigs along the ground with ones nose does not necessarily mean that that is the best way to collect firewood. --f46d04479f9541c7ad04d4eea1ba Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <head> <style type=3D"text/css"> <!-- /* start of attachment style */ .ygrp-photo-title{ clear: both; font-size: smaller; height: 15px; overflow: hidden; text-align: center; width: 75px; } div.ygrp-photo{ background-position: center; background-repeat: no-repeat; background-color: white; border: 1px solid black; height: 62px; width: 62px; } div.photo-title=20 a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited { text-decoration: none;=20 } div.attach-table div.attach-row { clear: both; } div.attach-table div.attach-row div { float: left; /* margin: 2px;*/ } p { clear: both; padding: 15px 0 3px 0; overflow: hidden; } div.ygrp-file { width: 30px; valign: middle; } div.attach-table div.attach-row div div a { text-decoration: none; } div.attach-table div.attach-row div div span { font-weight: normal; } div.ygrp-file-title { font-weight: bold; } /* end of attachment style */ --> </style> </head> <html> <head> <style type=3D"text/css"> <!-- #ygrp-mkp { border: 1px solid #d8d8d8; font-family: Arial; margin: 10px 0; padding: 0 10px; } #ygrp-mkp hr { border: 1px solid #d8d8d8; } #ygrp-mkp #hd { color: #628c2a; font-size: 85%; font-weight: 700; line-height: 122%; margin: 10px 0; } #ygrp-mkp #ads { margin-bottom: 10px; } #ygrp-mkp .ad { padding: 0 0; } #ygrp-mkp .ad p { margin: 0; } #ygrp-mkp .ad a { color: #0000ff; text-decoration: none; } --> </style> </head> <body> Again well done.<div><br></div><div>Again, it amazes me after all these yea= rs that Oracle does not support these facilities more easily. =A0Why put up= a barrier for people to migrate to Oracle!</div><div><br></div><div>Anthon= y<br> <br><div class=3D"gmail_quote">On Tue, Feb 5, 2013 at 4:01 AM, Franck Routi= er <span dir=3D"ltr"><<a href=3D"mailto:[email protected]" target= =3D"_blank">[email protected]</a>></span> wrote:<br><blockquote c= lass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;= padding-left:1ex"> =20=20 =20=20=20=20 =20=20 <div text=3D"#000000" bgcolor=3D"#FFFFFF"> <div>Hi,<br> <br> this has been a long process... but I finally implemented a QUERY OffsetStrategy for SDriverOracle that uses Oracle's native rownum idiom.<br> I had to slightly modify the signature of the limitSQL() method, but this was worth the effort:<br> I have a real life example where I read 1 million rows with a 15000 limit size, do some deduplication, and insert into another table.<br> Before this modification, it took 54 minutes on Postgresql (on a slightly slower server), but 2 hours and 25 minutes on Oracle (and even 2h38 without batch updates)...<br> Query time was getting longer and longer as the offset increased...<br> <br> After the modification, Oracle takes only 43 minutes !<br> <br> Comments are welcome,<br> <br> Franck<br> <br> <br> Le 03/10/2010 02:20, <a href=3D"mailto:[email protected]= om" target=3D"_blank">[email protected]</a> a =E9crit=A0:<br= > </div> <blockquote type=3D"cite"> <span>=A0</span> =20=20=20=20=20=20 <div> <p>Hello Franck,<br> <br> It amazes me that Oracle does not support scrollable cursors in the database, but there you are. Could you please add a short comment to the change explaining why you did it.<br> <br> There never has been a standard way to do this in traditional SQL. The Oracle ROWNUM is actually more general than than Limit/Offset -- eg. you could retrieve every 10th row for sampling, or use it to detect duplicate rows, pick the "best" etc. If someone is interested= it would not be that hard to wrap our queries with SELECT * FROM <original query> WHERE ROWNUM.... However, it would not be trivial.<br> <br> SQL 2003 implements a very magic CURRENT_ROW() function which is supported by Oracle and MSSQL, but not much else that I can tell. I would avoid it as it is complex and therefore more likely to have issues. (It is amazing that the incredibly complex SQL 92 & 99 did not address these very basic issues!)<br> <br> (Before MSSQL introduced CURRENT_ROW it was just about impossible to get at any row number, eg. to remove duplicate rows.)<br> <br> Thanks for the fix,<br> <br> Anthony<br> <br> At 02:21 AM 2/10/2010, Franck Routier wrote:<br> > <br> ><br> >I have set SDriverOracle offsetStrategy to SCAN, ie let Simpleorm drop<br> >records we want to skip. Anyway, this is already what Oracle driver is<br> >doing (but instead of dropping the records, it keeps them in a cache<br> >that eats all memory...).<br> ><br> >At least, this will always work.<br> ><br> >Franck<br> ><br> >Le vendredi 01 octobre 2010 =C3 15:42 +0200, Franck Routier a =C3=A9crit :<br> >> <br> >> Yes, I also found this :<br> >> <br> >> <<a href=3D"http://stackoverflow.com/questions/59= 5123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-keyword" target=3D= "_blank">http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alt= ernative-to-the-mysql-limit-keyword</a>><a href=3D"http://stackoverflow.= com/questions/595123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-ke= yword" target=3D"_blank">http://stackoverflow.com/questions/595123/is-there= -an-ansi-sql-alternative-to-the-mysql-limit-keyword</a><br> >> <br> >> Oracle seems to be one of the worse database regarding this issue.<br> >> But the rownum path is not easy in Simpleorm, as it won't fit in the<br> >> sql<br> >> structure that we rely on...<br> >> <br> >> Le vendredi 01 octobre 2010 =C3 15:01 +0200, Noel Grandin a =C3=A9crit :<br> >> > <br> >> > these 2 links have some solutions:<br> >> > <br> >> > <<a href=3D"http://www.club-oracle.com/forum= s/limit-clause-for-oracle-sql-t637/" target=3D"_blank">http://www.club-orac= le.com/forums/limit-clause-for-oracle-sql-t637/</a>><a href=3D"http://ww= w.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/" target=3D"_blan= k">http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/</a><= br> >> > <a href=3D"http://www.delphifaq.com/faq/databas= es/oracle/f594.shtml" target=3D"_blank">http://www.delphifaq.com/faq/databa= ses/oracle/f594.shtml</a><br> >> > <br> >> > the basic syntax looks like this:<br> >> > <br> >> > select * <br> >> > from ( <br> >> > select rownum rnum, a.* <br> >> > from (your_query) a <br> >> > where rownum <=3D :M ) <br> >> > where rnum >=3D :N; <br> >> > <br> >> > in order to get rows n through m from 'your query.'<br> >> > <br> >> > -- Noel.<br> >> > <br> >> > Franck Routier wrote: <br> >> > > <br> >> > > <br> >> > > Seems I spoke too quickly. Oracle does not seem to support the<br> >> ansi<br> >> > > (2008) "OFFSET x FETCH y ROWS" s= yntax, nor any proprietary syntax<br> >> to<br> >> > > do<br> >> > > that...<br> >> > > <br> >> > > Le vendredi 01 octobre 2010 =C3 13:55 +0200, Franck Routier a<br> >> =C3=A9crit :<br> >> > > > <br> >> > > > Hi,<br> >> > > > <br> >> > > > I am bitten by an oom exception using offset/limit with<br> >> > > SDriverOracle.<br> >> > > > The driver uses SDriver.OffsetStrategy.JDBC. The was done<br> >> assuming<br> >> > > > (from<br> >> > > > various reading but without any evidence) that the Oracle Driver<br> >> > > was<br> >> > > > smart enought to use a cursor on the server side to handle this.<br> >> > > > <br> >> > > > But I definitely get an oom caused by OracleResultCacheImpl<br> >> eating<br> >> > > all<br> >> > > > memory.<br> >> > > > <br> >> > > > So I searched again and found this, on<br> >> > > ><br> >> > ><br> >> <<a href=3D"http://download.oracle.com/docs/cd/B2= 8359_01/java.111/b31224/resltset.htm#CIHCHBJB" target=3D"_blank">http://dow= nload.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm#CIHCHBJB</a= >><a href=3D"http://download.oracle.com/docs/cd/B28359_01/java.111/b3122= 4/resltset.htm#CIHCHBJB" target=3D"_blank">http://download.oracle.com/docs/= cd/B28359_01/java.111/b31224/resltset.htm#CIHCHBJB</a><br> >> > > > <br> >> > > > "Oracle JDBC Implementation for Result Set Scrollability<br> >> > > > <br> >> > > > Because the underlying server does not support scrollable<br> >> cursors,<br> >> > > > (sic!) Oracle JDBC must implement scrollability in a separate<br> >> > > layer.<br> >> > > > <br> >> > > > It is important to be aware that this is accomplished by using a<br> >> > > > client-side memory cache to store rows of a scrollable result<br> >> set.<br> >> > > > <br> >> > > > Important:<br> >> > > > Because all rows of any scrollable result set are stored in the<br> >> > > > client-side cache, a situation where the result set contains<br> >> many<br> >> > > > rows,<br> >> > > > many columns, or very large columns might cause the client-side<br> >> > > Java<br> >> > > > Virtual Machine (JVM) to fail. Do not specify scrollability for<br> >> a<br> >> > > > large<br> >> > > > result set."<br> >> > > > <br> >> > > > So it seems that Oracle is not any smarter than Postgresql is,<br> >> and<br> >> > > > that<br> >> > > > resorting to a limit clause in the sql<br> >> > > (SDriver.OffsetStrategy.QUERY)<br> >> > > > would be a better solution for Oracle as well.<br> >> > > > <br> >> > > > So I propose to change the SDriverOracle to implement this<br> >> > > strategy.<br> >> > > > Does it sound ok ?<br> >> > > > <br> >> > > > Franck<br> >> > > > <br> >> > > > <br> >> > > > <br> >> > > > <br> >> > > > <br> >> > > <br> >> > > -- <br> >> > > Franck Routier <br> >> > > Logo Ax=C3=A8ge<br> >> > > Ax=C3=A8ge<br> >> > > 23,rue Saint-Simon<br> >> > > 63000 Clermont-Ferrand<br> >> > > T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%= 2063%2005%2095%2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 0= 5 95 40</a><br> >> > > Fax: <a href=3D"tel:%2B33%20%280%294%2073%= 2070%2065%2029" value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 = 29</a><br> >> > > Email: <a href=3D"mailto:franck.routier%40axege.com" target=3D"_blan= k"><mailto:franck.routier%40axege.com></a><a href=3D"mailto:franck.ro= utier%40axege.com" target=3D"_blank">[email protected]</a><br> >> > > <br> >> > > <br> >> > > <br> >> > > <br> >> > <br> >> > <br> >> > <br> >> > <br> >> > __________________________________________________________<br= > >> > Disclaimer: <<a href=3D"http://www.peralex.c= om/disclaimer.html" target=3D"_blank">http://www.peralex.com/disclaimer.htm= l</a>><a href=3D"http://www.peralex.com/disclaimer.html" target=3D"_blan= k">http://www.peralex.com/disclaimer.html</a><br> >> > <br> >> > <br> >> > <br> >> > <br> >> > <br> >> <br> >> -- <br> >> Franck Routier <br> >> Logo Ax=C3=A8ge<br> >> Ax=C3=A8ge<br> >> 23,rue Saint-Simon<br> >> 63000 Clermont-Ferrand<br> >> T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%2063%2005%= 2095%2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 05 95 40</a= ><br> >> Fax: <a href=3D"tel:%2B33%20%280%294%2073%2070%2065%= 2029" value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 29</a><br> >> Email: <a href=3D"mailto:franck.routier%40axege.com"= target=3D"_blank"><mailto:franck.routier%40axege.com></a><a href=3D"= mailto:franck.routier%40axege.com" target=3D"_blank">[email protected]= om</a><br> >> <br> >> <br> >> <br> >> <br> >> <br> ><br> >-- <br> >Franck Routier <br> >Logo Ax=C3=A8ge<br> >Ax=C3=A8ge<br> >23,rue Saint-Simon<br> >63000 Clermont-Ferrand<br> >T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%2063%2005%2095%= 2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 05 95 40</a><br> >Fax: <a href=3D"tel:%2B33%20%280%294%2073%2070%2065%2029"= value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 29</a><br> >Email: <a href=3D"mailto:franck.routier%40axege.com" targ= et=3D"_blank"><mailto:franck.routier%40axege.com></a><a href=3D"mailt= o:franck.routier%40axege.com" target=3D"_blank">[email protected]</a= ><br> ><br> ><br> <br> Spreadsheet Detective,<br> Southern Cross Software Queensland Pty Limited<br> 54 Gerler Street<br> Bardon, Queensland 4065, Australia.<br> <br> Email: <a href=3D"mailto:berglas%40spreadsheetdetective.com" = target=3D"_blank">[email protected]</a><br> <a href=3D"http://www.SpreadsheetDetective.com" target=3D"_bl= ank">www.SpreadsheetDetective.com</a><br> Ph: <a href=3D"tel:%2B61%20427%20830248" value=3D"+6142783024= 8" target=3D"_blank">+61 427 830248</a> (Australian Eastern Standard Time)<= br> <br> "If the model seems correct only because the numbers loo= k right, <br> then why build the model in the first place?"<br> <br> </p> </div> =20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20 =20=20=20=20=20=20 </blockquote> <br> </div> </blockquote></div><br><br clear=3D"all"><div><br></div>-- <br><p> </p><p>Dr Anthony Berglas, <a href=3D"mailto:[email protected]" target=3D= "_blank">[email protected]</a>=A0=A0=A0=A0=A0=A0 Mobile: +61 4 4838 8874<= br> Just because it is possible to push twigs along the ground with ones nose<b= r> does not necessarily mean that that is the best way to collect firewood.</p= > </div> <!-- |**|begin egp html banner|**| --> <br> =20=20=20=20 =20=20=20=20 <br> <!-- |**|end egp html banner|**| --> <div width=3D"1" style=3D"color: white; clear: both;"/>__._,_.___</div> <!-- Start Recommendations --> <!-- End Recommendations --> <!-- |**|begin egp html banner|**| --> <img src=3D"http://geo.yahoo.com/serv?s=3D97476590/grpId=3D7360226/grpspI= d=3D1705006905/msgId=3D2078/stime=3D1360021283" width=3D"1" height=3D"1"> <= br> <!-- |**|end egp html banner|**| --> =20=20 <!-- |**|begin egp html banner|**| --> <br> <div style=3D"font-family: verdana; font-size: 77%; border-top: 1px s= olid #666; padding: 5px 0;" > Your email settings: Individual Email|Traditional <br> <a href=3D"http://groups.yahoo.com/group/SimpleORM/join;_ylc=3DX3oDMT= Jma3Bha3RiBF9TAzk3NDc2NTkwBGdycElkAzczNjAyMjYEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlY= wNmdHIEc2xrA3N0bmdzBHN0aW1lAzEzNjAwMjEyODM-">Change settings via the Web</a= > (Yahoo! ID required) <br> Change settings via email: <a href=3D"mailto:SimpleORM-digest@yahoogr= oups.com?subject=3DEmail Delivery: Digest">Switch delivery to Daily Digest<= /a> | <a href =3D "mailto:[email protected]?subject=3D= Change Delivery Format: Fully Featured">Switch to Fully Featured</a> <br> <a href=3D"http://groups.yahoo.com/group/SimpleORM;_ylc=3DX3oDMT= Jkam1idm10BF9TAzk3NDc2NTkwBGdycElkAzczNjAyMjYEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlY= wNmdHIEc2xrA2hwZgRzdGltZQMxMzYwMDIxMjgz"> Visit Your Group=20 </a> | <a href=3D"http://docs.yahoo.com/info/terms/"> Yahoo! Groups Terms of Use </a> | <a href=3D"mailto:[email protected]?subject=3DUns= ubscribe"> Unsubscribe=20 </a>=20 <br> </div> <br> <!-- |**|end egp html banner|**| --> <div style=3D"color: white; clear: both;"/>__,_._,___</div> </body> </html> --f46d04479f9541c7ad04d4eea1ba--