I was wondering what is the default maximum memory for hash joins.
Looking at OptimizerFactoryImpl I see
protected int maxMemoryPerTable = 1048576 unless overridden by
"derby.language.maxMemoryPerTable";
Is actually intended per table or per active query? I don't see the
property in the documentation.
If I set this to zero will it turn off hash joins all together?
In BackingStoreHashTableFromScan I see.
this.max_inmemory_rowcnt = max_inmemory_rowcnt;
if( max_inmemory_rowcnt > 0)
max_inmemory_size = Long.MAX_VALUE;
else
max_inmemory_size = Runtime.getRuntime().totalMemory()/100;
So what is the intent and actual behavior of
"derby.language.maxMemoryPerTable" and its default and do they match?
Are there other factors that go into setting the ceiling for memory
usage for has joins.
Thanks
Kathey
P.S.
In actual practice on a *very* old derby version Apache Derby -
10.1.2.1 - (330608) I am looking at a hprof dump which shows almost 2GB
of Blob and clob objects that trace back to hash joins and a
BAckingStoreHashTableFromScan objects that have values as below with
max_inmemory_size as Long.MAX_VALUE as I would expect from the above code.
e.g.
instance of
org.apache.derby.impl.store.access.BackingStoreHashTableFromScan@0xa59f7d08
(63 bytes)
Class:
class org.apache.derby.impl.store.access.BackingStoreHashTableFromScan
Instance data members:
auxillary_runtimestats (L) : <null>
diskHashtable (L) : <null>
hash_table (L) : java.util.Hashtable@0xa59f7d48 (40 bytes)
inmemory_rowcnt (J) : 8686
keepAfterCommit (Z) : false
key_column_numbers (L) : [I@0xa33b6110 (12 bytes)
max_inmemory_rowcnt (J) : 58254
max_inmemory_size (J) : 9223372036854775807
open_scan (L) :
org.apache.derby.impl.store.access.heap.HeapScan@0xa59f7f10 (64 bytes)
remove_duplicates (Z) : false
row_source (L) : <null>
skipNullKeyColumns (Z) : true
tc (L) : org.apache.derby.impl.store.access.RAMTransaction@0x8f960428
(57 bytes)
References to this object:
org.apache.derby.impl.sql.execute.HashScanResultSet@0xa33b5fc8 (321
bytes) : field hashtable
Other Queries