Hi Nick, You can find information about how selectivity and cardinality statistics are maintained by Derby at:
http://db.apache.org/derby/docs/dev/tuning/tuning-single.html#ctunstats18908 Cheers --francois On Fri, Apr 17, 2009 at 4:05 PM, Nick Puz <nick.de...@me.com> wrote: > Hi Knut, > > Thanks for the response, I'll take a look into the cloudscape docs and how > execute is implemented. I'll also look more at the statement cache to see > about persisting it on shutdown and restoring on startup, so that then it > could be done globally for all statements (as an option). Another > alternative would be to let the user specify which to persist as a comment > in the sql (as is done with the optimizer overrides to specify index usage, > etc.), possibly as a different runtime option. The advantage of the first > (global) is that apps could take advantage with no sql changes. Perhaps > persist the N most recently used statements... > > In terms of invalidating, a crude but simple way would be to have the > version of derby stored with the prepared statements and just to discard > them if the version numbers differ. The same mechanism coudl be used as when > deciding to recompile the system stored statements. What do you think? > > Besides version changes the statements should probably be > removed/regenerated if the statistics used to determine the execution plan > change. How does derby manage the statistics, are they automatically kept up > to date or does the user have to do something specific? Do you happen to > know what happens with the stored trigger actions, since they should have > the same problem. I'll take a look at the code to try to figure it out in > the next few days but just curious if you or another derby dev knows... > > -Nick > > On Friday, April 17, 2009, at 07:09AM, "Knut Anders Hatlen" > <knut.hat...@sun.com> wrote: > >Nick Puz <nick.de...@me.com> writes: > > > >> Hi Derby Developers, > >> > >> I'm evaluating derby for use in the backend of a internet (web+http > >> direct) based service. We have a bunch of mid-tier app server type > >> boxes that all access data mounted on a bunch of nfs filers (so any > >> mid-tier can handle a user request) and so the current thinking is for > >> usage pattern (mimicing what is done in other places in this 5+ year > >> old live system) would be to: > >> 1) lock db directory for user (using symlinks -- atomic nfs op) > >> ... would be done external to derby. > >> 2) open database for the user > >> 3) do operation to satisfy caller's request > >> 4) close db then remove lock. > >> > >> Unfortunately with this usage model the perf benefits of prepared > >> statements go away (parameters still nicer then encoding for string > >> sql stmts). I've done a bit of performance testing and as expected a > >> ton of time is spent preparing a simple primary key lookup query > >> (primarily due to opening/reading the many system tables and few > >> indexes on the table), while the execution goes quite fast. > >> > >> In digging around the code I saw that the statements used for trigger > >> actions are stored to remove this cost on each action invocation, > >> would it be possible to expose this end user statements. In our case a > >> mode that just keeps a persistent cache of the last N statements would > >> be fine, no need to expose at all at the jdbc/sql level. I'm > >> comfortable making the code change but would like to know before > >> embarking on this the thoughts/advice of experienced derby developers. > > > >Hi Nick, > > > >I think you're right that it should be possible to build something on > >top of the stored prepared statements to get what you need. Cloudscape > >(Derby's predecessor) used to give you that functionality with CREATE > >STATEMENT and EXECUTE STATEMENT. The CREATE STATEMENT statement was > >removed from the code before it was donated to Apache, but EXECUTE > >STATEMENT is still there, so you can actually still do this to execute > >one of the statements stored in SYS.SYSSTATEMENTS: > > > >PreparedStatement ps = > > conn.prepareStatement("execute statement sys.\"getSchemas\""); > >ps.setString(1, "%"); > >ps.setString(2, "%"); > >ResultSet rs = ps.executeQuery(); > > > >The old CREATE STATEMENT syntax is described here: > > > http://www.dwfa.ca/Library/Java/Cloudscape/v3.6.1/doc/html/coredocs/sqlj15.htm > > > >My guess is that it was removed because the SQL standard doesn't define > >a syntax for storing compiled statements (as far as I'm aware). If we > >find a solution to the problem with the lack of a standardized way to do > >it, I think such a functionality would be useful. (At least, I don't see > >why persisting user-defined statements should be less useful than > >persisting the meta-data queries, which we already do.) > > > >Persisting the statement cache on shutdown is an interesting thought, > >and it would be transparent to the users. It should probably be optional > >so that we don't start writing lots of data on shutdown for users that > >don't need/want it, and I'd guess there would be some upgrade concerns > >too. I think I'd prefer a per-statement solution, though, as it would > >give the user better control over the behaviour. > > > >-- > >Knut Anders > > > > >