I'd suggest ClojureQL only optimize lisp form to SQL text
transformation, and provide options whether to use PreparedStatement
or not. Leave other kind of optimizations to databases/drivers.

Some thoughts below:

- PreparedStatement avoids high cost of frequent query planning
(oracle call it hard parsing) and SQL injection, which are critical
for OLTP workload. However, it's not always good practice for
datawarehousing queries. In some high end databases, query planner
need to see join and filter conditions as constant for the best query
planning (e.g. leveraging histogram, partition statistics).  ClojureQL
can provide controls to evaluate clojure variables right before
creating SQL string. Not sure about whether at variable level, or
statement level, or connection level though. I can see various trade-
offs (simplicity vs flexibility etc).

- Client side JDBC Statement caching should leave to db Driver, or
DataSource implementations. Most of high end database and JEE
appserver do, with various trade-offs and complexities. I think
ClojureQL should stay away from them.

BTW, great library and fun to use!

On Jan 7, 6:23 am, LauJensen <lau.jen...@bestinclass.dk> wrote:
> Hi Sean,
>
> Half right - It will compile everytime, but not necessary create the
> AST everytime:
>
> (let [my-table (-> (table :user)
>     (select (where (= :id user-id)))
>     (project [:dateofbirth :gender :zipcode]))]
>   (repeatedly @my-table))
>
> However I see there are some good thoughts on optimization in this
> thread already.
> Perhaps is the AST always kept the SQL representation in a field, we
> could totally
> avoid re-compilation for repeat queries. That would still created the
> preparedStatement,
> but Im not sure thats a real time-stealer. I'll have to check.
>
> On Jan 7, 1:33 am, Sean Corfield <seancorfi...@gmail.com> wrote:
>
> > On Thu, Jan 6, 2011 at 2:33 AM, LauJensen <lau.jen...@bestinclass.dk> wrote:
> > > Yes the two statements are equivalent. ClojureQL compiles everything
> > > to prepared
> > > statements, with every argument automatically paramterized.
>
> > Cool, that's what I'd hoped. But just to clarify...
>
> > If I have code that repeatedly calls this:
>
> > @(-> (table :user)
> >     (select (where (= :id user-id)))
> >     (project [:dateofbirth :gender :zipcode]))
>
> > it is going to construct that AST and compile it to SQL every time it
> > hits it, yes?
> > --
> > Sean A Corfield -- (904) 302-SEAN
> > Railo Technologies, Inc. --http://getrailo.com/
> > An Architect's View --http://corfield.org/
>
> > "If you're not annoying somebody, you're not really alive."
> > -- Margaret Atwood

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to