On 11-May-2016 13:06 -0500, Charles Wilt wrote:
On 11-May-2016 12:56 -0500, dlclark wrote:
We were having performance issues and we hired IBM to, among other
things, take a look at our SQL usage and to advise us the
correct/best way to use SQL. One of the things that came out in
the process was that our environment has nearly 600 "local" data
libraries with the same tables in every library plus we have a
"shared" data library. Library lists will have one "local" data
library and the one "shared" data library in them. "Local" users
don't switch library lists for their interactive sessions but some
of the jobs that run on their behalf have to switch library lists
to process all of the files. The resulting IBM recommendation to
us was to use static SQL for the "shared" data library but to use
dynamic SQL for the "local" data libraries. We also contracted for
SQL training and the trainer agreed regarding our situation with
the same table names in multiple data libraries.
So did switching to dynamic SQL help performance?
Seems a bit strange to me...
At worst, I'd expect a re-plan for a static statement to perform no
worse than building a plan for a dynamic statement.
The issue is how many times the query must [be reoptimized and thus]
have the access plan rebuilt and stored again. In the described
scenario, the use of the one program for the static SQL written against
one qualified table-reference but performed against table-references
with changing library qualifiers can be expensive in terms of the
resources utilized.
At best, I'd think a re-plan for a static statement to be better
than building one for a dynamic statement.
Contention and authority checks [and I hope\expect that the authority
violations were long since eliminated] to store the plan for static are
likely more costly than for dynamic; space management costs are probably
not consistent nor predictable for each. But accounting solely for the
AccPln rebuilds, the costs are probably nearly the same betwixt. Of
course the parsing and syntax checking is the conspicuous overhead for
dynamic, and then searching the plan cache for a matching plan, are all
beyond what is required for static -- but those actions are not
officially part of the plan-rebuild.
Perhaps Chuck or one of the others on here with more knowledge of
the internals will chime in.
A switch to dynamic has been helpful to some, for performance
reasons, in scenarios similar to that described. Note: I see in
followup replies, that the issue dlclark had resolved by switching to
dynamic, was a functional issue; i.e. the switch was made, to circumvent
a defect, not to improve performance. Nonetheless, I offer:
For static: Contention on a single resource is one potential issue.
Another issue is that every authorized winner in contention then gets to
replace a stale plan; conspicuously, replacement directly, if there is
no contention. Then every time the library name for a resource changes
[i.e. the table-reference changes], the plan is rebuilt, and either the
authorized invoker gets to replace the stale plan or the unauthorized
invoker merely discards the refreshed plan and therefore leaves a stale
plan; stale for that invocation, and for all but one invocation naming
just that one of the 600 libraries.
So let's presume that there is no contention, whereby the program is
run successively\serially with each run against a different library of
the 600; the plan is rewritten 600 times; i.e. the new plan as a rebuild
of the former and then physically written to [/disk/ in] the associated
space of the program. Each time that scenario repeats, that is
effectively a rebuild+rewrite->run repeated for every invocation of the
query\program; i.e. 600 more rebuild+rewrites. Conspicuously, the
benefits of static appear debased in such a [contrived] scenario.
For dynamic: The contention is the plan cache, only on the first run
of a query. Then on secondary runs, only the specific plan in the cache
can be in contention, but only if\when the plan must be rebuilt and thus
the refreshed plan rewritten.
So let's presume that there is no contention, whereby the program is
run successively\serially with each run against a different library of
the 600; a plan is built anew and stored for each run, physically
written to /disk/ in the plan cache, leaving 600 near-identical copies,
with just the library name of the table-reference(s) changing. Each
time that scenario repeats, that is effectively a read-only->run
repeated for every invocation of the query in the program; i.e. no more
rebuilds, nor more rewrites [none at least, for the library-name
changes]. Therefore, the more times these queries run, the more
tangible are the savings in CPU and disk writes.
Note: An alternate /solution/ for the static, mimicking the benefits
of a change to dynamic, yet while retaining the benefits of static, is
to create the 600 variants of the program. In doing so, each has its
own plan for the specific library name referenced\resolved in the static
SQL, rather than trying to share just one copy of the plan that must be
rebuilt each time the program runs against the file in a library other
than the one library for which the plan was most recently [re]created.
As an Amazon Associate we earn from qualifying purchases.