@page @section @code{DB->del} @setfilename tokudb @settitle DB->del @c man title db_del tokudb @unnumberedsubsec Synopsis @c man begin SYNOPSIS @code{#include } @noindent @code{int DB->del(DB *}@var{db}@code{, DB_TXN *}@var{txnid}@code{, DBT*}@var{key}@code{, u_int32_t }@var{flags}@code{);} @c man end @unnumberedsubsec Description @c man begin DESCRIPTION @code{DB->del} removes all the key/data pairs that match @var{key}. If there are duplicates, all matching records are removed. When called on a secondary index (associated via @code{DB->associate(3)}), all the matching keys in the secondary database are used to identify keys/data pairs in the primary database. The keys in the primary are all removed, and all the corresponding records in all the secondary indices are removed. @c man end @unnumberedsubsec Parameters @c man begin PARAMETERS @table @var @item db The @code{DB} handle for the database. @item txnid Either @code{NULL} or a @code{TXNID}. @item key The key to be deleted. @item flags Must be zero or @code{DB_DELETE_ANY}. Using @code{DB_DELETE_ANY} causes @code{DB->del()} to possibly return @code{0} even if there are no matching key/data pairs. Note: @code{DB_DELETE_ANY} is a Tokutek extension to the Berkeley@tie{}DB API. A program developed for TokuDB can be used with Berkeley@tie{}DB by adding this to the code: @example #ifndef TOKUDB #define DB_DELETE_ANY 0 #endif @end example @end table @c man end @unnumberedsubsec Return Value @c man begin RETURNVALUE Returns zero on success. Success is defined to be that either there was at least one matching key/data pair and it was deleted, or there were zero or more matching key/data pairs, and they were all deleted, and @code{BDB_DELETE_ANY} was passed. The following non-zero values can be returned: @table @code @item DB_NOTFOUND If the flags do not include @code{BDB_DELETE_ANY} and there was no matching key/data pair, then @code{DB->del} returns @code{BDB_NOTFOUND}. It is allowed for TokuDB to return @code{DB_NOTFOUND} even if @code{BDB_DELETE_ANY} is specified. Using @code{DB_DELETE_ANY} means that the caller does not care whether the result is @code{0} or @code{DB_NOTFOUND}. @item DB_DEADLOCK The system discovered deadlock cycle involving this and other transactions. This operation was killed. @item DB_LOCK_NOTGRANTED In an environment configured for lock timeouts, the system was unable to grant a lock within the allowed time. @item EINVAL You passed invalid parameters to this operation. @end table @c man end @unnumberedsubsec Notes @c man begin NOTES Performing a deletion without @code{DB_DELETE_ANY} is relatively expensive. For example, suppose you have a large database that is stored on disk and is much larger than main memory. Then @code{DB->get()} using a randomly selected key usually requires at least one disk-head movement, limiting you about 100 to 150 get operations per second per disk drive. A delete operation that doesn't require the @code{DB_NOTFOUND} result to be computed can run much faster, however (orders of magnitude faster in some cases.) For the @code{DB->del} operation to compute the @code{DB_NOTFOUND} result requires a get, which slows down the deletions. However, suppose that the key you are deleting is already in main memory (because you recently accessed it). In that case, there is likely to be little or no performance difference between using @code{DB_DELETE_ANY} or not. Associated secondary indexes can also slow down deletion operations, since TokuDB performs a @code{DB->get} to get the primary key/data pair so that it can use the callback function to compute all the secondary keys that must be deleted. One way to achieve fast deletions with secondary indices is to design your primary key so that contiguous ranges will be removed from your database at the same time. For example, if you design your primary key to be a timestamp, and you expire the oldest data first, then deletions can run fast: Use a cursor to find the leftmost item, and delete it, move right, delete some more, and so forth. The cursor scan is fast, and the deletes on all the secondary keys will be fast too. @c man end @include everyman.texi