Changeset: 5e48034183ab for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5e48034183ab Modified Files: sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h sql/storage/bat/bat_table.c Branch: Oct2014 Log Message:
Cache (delta bats) only during catalog loading. Added caching of tids bats, solves mserver5 startup performance problems diffs (159 lines): diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -31,14 +31,22 @@ timestamp_delta( sql_delta *d, int ts) { while (d->next && d->wtime > ts) d = d->next; + if (0 && d && d->cached) { + bat_destroy(d->cached); + d->cached = NULL; + } return d; } -static sql_dbat * +sql_dbat * timestamp_dbat( sql_dbat *d, int ts) { while (d->next && d->wtime > ts) d = d->next; + if (0 && d && d->cached) { + bat_destroy(d->cached); + d->cached = NULL; + } return d; } @@ -646,6 +654,11 @@ delete_tab(sql_trans *tr, sql_table * t, } bat = t->data; /* delete all cached copies */ + + if (bat->cached) { + bat_destroy(bat->cached); + bat->cached = NULL; + } for (n = t->columns.set->h; n; n = n->next) { sql_column *c = n->data; sql_delta *bat; @@ -1259,6 +1272,10 @@ destroy_dbat(sql_trans *tr, sql_dbat *ba _DELETE(bat->dname); if (bat->dbid) temp_destroy(bat->dbid); + if (bat->cached) { + bat_destroy(bat->cached); + bat->cached = NULL; + } bat->dbid = 0; bat->dname = NULL; _DELETE(bat); @@ -1712,6 +1729,15 @@ tr_update_dbat(sql_trans *tr, sql_dbat * if (!fdb) return ok; + + if (fdb->cached) { + bat_destroy(fdb->cached); + fdb->cached = NULL; + } + if (tdb->cached) { + bat_destroy(tdb->cached); + tdb->cached = NULL; + } assert(store_nr_active==1); db = temp_descriptor(fdb->dbid); if (BUNlast(db) > db->batInserted || cleared) { diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h --- a/sql/storage/bat/bat_storage.h +++ b/sql/storage/bat/bat_storage.h @@ -40,6 +40,7 @@ typedef struct sql_dbat { char *dname; /* name of the persistent deletes bat */ int dbid; /* bat with deletes */ size_t cnt; + BAT *cached; /* cached copy, used for schema bats only */ int wtime; /* time stamp */ struct sql_dbat *next; /* possibly older version of the same deletes */ } sql_dbat; @@ -49,6 +50,7 @@ extern int bat_storage_init( store_funct extern int dup_bat(sql_trans *tr, sql_table *t, sql_delta *obat, sql_delta *bat, int type, int oc_isnew, int c_isnew); extern sql_delta * timestamp_delta( sql_delta *d, int ts); +extern sql_dbat * timestamp_dbat( sql_dbat *d, int ts); #endif /*BATSTORAGE_H */ diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c --- a/sql/storage/bat/bat_table.c +++ b/sql/storage/bat/bat_table.c @@ -23,7 +23,7 @@ #include "bat_storage.h" static BAT * -delta_cands(sql_trans *tr, sql_table *t) +_delta_cands(sql_trans *tr, sql_table *t) { sql_column *c = t->columns.set->h->data; /* create void,void bat with length and oid's set */ @@ -54,7 +54,26 @@ delta_cands(sql_trans *tr, sql_table *t) } static BAT * -delta_full_bat_( sql_column *c, sql_delta *bat, int temp) +delta_cands(sql_trans *tr, sql_table *t) +{ + sql_dbat *d; + BAT *tids; + + if (!t->data) { + sql_table *ot = tr_find_table(tr->parent, t); + t->data = timestamp_dbat(ot->data, tr->stime); + } + d = t->data; + if (d->cached && !tr->parent) + return temp_descriptor(d->cached->batCacheid); + tids = _delta_cands(tr, t); + if (!d->cached && !tr->parent) /* only cache during catalog loading */ + d->cached = temp_descriptor(tids->batCacheid); + return tids; +} + +static BAT * +delta_full_bat_( sql_trans *tr, sql_column *c, sql_delta *bat, int temp) { /* return full normalized column bat * b := b.copy() @@ -91,17 +110,17 @@ delta_full_bat_( sql_column *c, sql_delt } bat_destroy(u); (void)c; - if (!bat->cached) + if (!bat->cached && !tr->parent) bat->cached = temp_descriptor(b->batCacheid); return b; } static BAT * -delta_full_bat( sql_column *c, sql_delta *bat, int temp) +delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int temp) { - if (bat->cached) + if (bat->cached && !tr->parent) return temp_descriptor(bat->cached->batCacheid); - return delta_full_bat_( c, bat, temp); + return delta_full_bat_( tr, c, bat, temp); } static BAT * @@ -109,9 +128,9 @@ full_column(sql_trans *tr, sql_column *c { if (!c->data) { sql_column *oc = tr_find_column(tr->parent, c); - c->data = oc->data; + c->data = timestamp_delta(oc->data, tr->stime); } - return delta_full_bat(c, c->data, isTemp(c)); + return delta_full_bat(tr, c, c->data, isTemp(c)); } static oid column_find_row(sql_trans *tr, sql_column *c, const void *value, ...); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list