Extensible Storage Engine ( ESE ), also known as JET Blue , is an ISAM (indexed sequential access method) data storage technology from Microsoft . ESE is the core of Microsoft Exchange Server , Active Directory , and Windows Search . It is also used by a number of Windows components including Windows Update client and Help and Support Center . Its purpose is to allow applications to store and retrieve data via indexed and sequential access.
95-575: ESE provides transacted data update and retrieval. A crash recovery mechanism is provided so that data consistency is maintained even in the event of a system crash. Transactions in ESE are highly concurrent making ESE suitable for server applications. ESE caches data intelligently to ensure high performance access to data. In addition, ESE is lightweight making it suitable for auxiliary applications. The ESE Runtime (ESENT.DLL) has shipped in every Windows release since Windows 2000 , with native x64 version of
190-436: A database management system (or similar system) against a database , that is treated in a coherent and reliable way independent of other transactions. A transaction generally represents any change in a database. Transactions in a database environment have two main purposes: In a database management system, a transaction is a single unit of logic or work, sometimes made up of multiple operations. Any logical calculation done in
285-423: A gigabyte (GB) is 10 bytes and specifies the term gibibyte (GiB) to denote 2 bytes. These differences are still readily seen, for example, when a 400 GB drive's capacity is displayed by Microsoft Windows as 372 GB instead of 372 GiB. Analogously, a memory module that is labeled as having the size " 1 GB " has one gibibyte ( 1 GiB ) of storage capacity. In response to litigation over whether
380-646: A Text or Long Text column. These indexes are called tuple indexes. They are used to speed queries with sub-string matching predicates. Tuple indexes can only be defined for Text columns. For example, if a Text column value is “I love JET Blue” , and the index is configured to have a minimum tuple size of 4 characters and a maximum tuple length of 10 characters, then the following sub-strings will be indexed: “ love JET ” “love JET B” “ove JET Bl” “ve JET Blu” “e JET Blue” “ JET Blue” “JET Blue” “ET Blue” “T Blue” “ Blue” “Blue” Even though tuple indexes can be very large, they can significantly speed queries of
475-780: A concurrency control mechanism called multi-versioning. In multi-versioning, every transaction queries a consistent view of the entire database as it was at the time the transaction started. The only updates it encounters are those made by it. In this way, each transaction operates as though it was the only active transaction running on the system, except in the case of write conflicts. Since a transaction may make changes based on data read that has already been updated in another transaction, multi-versioning by itself does not guarantee serializable transactions. However, serializability can be achieved when desired by simply using explicit record read locks to lock read data that updates are based upon. Both read and write locks may be explicitly requested with
570-442: A consistent mode in a database is known as a transaction. One example is a transfer from one bank account to another: the complete transaction requires subtracting the amount to be transferred from one account and adding that same amount to the other. A database transaction, by definition, must be atomic (it must either be complete in its entirety or have no effect whatsoever), consistent (it must conform to existing constraints in
665-454: A database or other data store. When this happens it is often important to ensure that all such processing leaves the database or data store in a consistent state. Examples from double-entry accounting systems often illustrate the concept of transactions. In double-entry accounting every debit requires the recording of an associated credit. If one writes a check for $ 100 to buy groceries, a transactional double-entry accounting system must record
760-437: A database page size when data is stored in long value columns. When a long value reference is stored in a record, only 9 bytes of in-record data are required. These long values may themselves be up to 2 gigabytes (GB) in size. Records are typically uniform in that each record has a set of values for the same set of columns. In ESE, it is also possible to define many columns for a table, and yet have any given record contain only
855-503: A disk with an advertised capacity of, for example, 400 GB (meaning 400 000 000 000 bytes , equal to 372 GiB) might be reported by the operating system as " 372 GB ". For RAM , the JEDEC memory standards use IEEE 100 nomenclature which quote the gigabyte as 1 073 741 824 bytes (2 bytes). The difference between units based on decimal and binary prefixes increases as a semi-logarithmic (linear-log) function—for example,
950-532: A drive that uses a different physical sector size ( Advanced Format Drives), ESENT will report errors. This is a known issue and Microsoft has hot fixes available. For Windows Vista or Windows Server 2008 see KB2470478. For Windows 7 or Windows Server 2008 R2 see KB982018. JET Blue was originally developed by Microsoft as a prospective upgrade for the JET Red database engine in Microsoft Access , but
1045-539: A feature similar to sorting where the desired aggregate is a natural result of the sort process. Retrieving column data directly from secondary indexes is an important performance optimization. Columns may be retrieved directly from secondary indexes, without accessing the data records, via the RetrieveFromIndex flag on the RetrieveColumns operation. It is much more efficient to retrieve columns from
SECTION 10
#17327985307361140-430: A fractional position within an index. In this way, the cursor can be quickly moved to a thumb bar position. This operation is performed with the same speed as a Seek operation. No intervening data must be accessed. Each cursor has a copy buffer in order to create a new record, or modify an existing record, column by column. This is an internal buffer whose contents can be changed with SetColumns operations. Modifications of
1235-418: A given table, columns fall into one of two categories: those which either occur exactly once in each of the records, with possibly a few NULL values; and those which occur rarely, or which may have multiple occurrences in a single record. Fixed and variable columns belong to the former category, while tagged columns belong to the latter. The internal representation of the two column categories is different, and it
1330-432: A new high speed backup method. Shadow copy backups are dramatically faster because the copy is virtually made after a brief period of quiescing an application. As subsequent updates are made to the data, the virtual copy is materialized. In some cases, hardware support for shadow copy backups means that actually saving the virtual copies is unnecessary. Shadow copy backups are always full backups. Restore can be used to apply
1425-415: A notable example of this usage in software, which report files sizes in decimal units. The binary definition uses powers of the base 2, as does the architectural principle of binary computers . This usage is widely promulgated by some operating systems , such as Microsoft Windows in reference to computer memory (e.g., RAM ). This definition is synonymous with the unambiguous unit gibibyte . Since
1520-450: A page to overflow, the page is split: a new page is allocated and is logically chained in between the two previously adjacent pages. Since this new page is not physically adjacent to its logical neighbors, access to it is not as efficient. ESE has an on-line compaction feature that re-compacts data. If a table is expected to be frequently updated, space may be reserved for future insertions by specifying an appropriate page density when creating
1615-443: A part of a transaction may be rolled back, without need to roll back the entire transaction; a CommitTransaction of a nested transaction merely signifies the success of one phase of processing, and the outer transaction may yet fail. Changes are committed to the database only when the outermost transaction is committed. This is known as committing to transaction level 0. When the transaction commits to transaction level 0, data describing
1710-466: A record is inserted. As a result, the physical order of records in a DBK index is chronological insertion order, and new records are always added at the end of the table. If an application wishes to cluster data on a non-unique index, this is possible by adding an autoincrement column to the end of the non-unique index definition. Indexes can be defined over multi-valued columns. Multiple entries may exist in these indexes for records with multiple values for
1805-494: A restriction is to use an available index. However, if a query involves multiple restrictions then applications often process the restrictions by walking the full index range of the most restrictive predicate satisfied by a single index. Any remaining predicate, called the residual predicate, is processed by applying the predicate to the record itself. This is a simple method but has the disadvantage of potentially having to perform many disk accesses to bring records into memory to apply
1900-578: A secondary index, than from the record, when navigating by the index. If the column data were retrieved from the record, then an additional navigation is necessary to locate the record by the primary key. This may result in additional disk accesses. When an index provides all columns needed then it is called a covering index. Note that columns defined in the table primary index are also found in secondary indexes and can be similarly retrieved using JET_bitRetrieveFromPrimaryBookmark. Index keys are stored in normalized form which can be, in many cases, denormalized to
1995-498: A series of index ranges on indexes from the same table and returns a temporary table of primary keys that can be used to navigate to the base table records that satisfy all index predicates. A join is a common operation on a normalized table design, where logically related data is brought back together for use in an application. Joins can be expensive operations because many data accesses may be needed to bring related data into memory. This effort can be optimized in some cases by defining
SECTION 20
#17327985307362090-402: A single backup, or it can be used to apply a combination of a single full backup with one or more incremental backups. Further, any existing log files can be replayed as well to recreate an entire data set all the way up to the last transaction logged as committed to transaction level 0. Restoration of a backup can be made to any system capable of supporting the original application. It need not be
2185-410: A single base table that contains data for two or more logical tables. The column set of the base table is the union of the column sets of these logical tables. Tagged columns make this possible because of their good handling of both multi-valued and sparse valued data. Since related data is stored together in the same record, it is accessed together thereby minimizing the number of disk accesses to perform
2280-512: A small number of non-NULL column values. In this sense, a table can also be a collection of heterogeneous records. ESE supports a wide range of columns values, ranging in size from 1-bit to 2 GB. Choosing the correct column type is important because the type of a column determines many of its properties, including its ordering for indexes. The following data types are supported by ESE: Each ESE table can define up to 127 fixed length columns, 128 variable length columns and 64,993 tagged columns. For
2375-535: A special set of Windows code called the Trusted Computing Base (TCB). The number of Microsoft applications using JET Blue continues to grow and the JET Blue API was published in 2005 to facilitate usage by an ever-increasing number of applications and services both within and beyond Windows. Transaction (database) A database transaction symbolizes a unit of work , performed within
2470-593: A standard definition of 1000 bytes, as well as a discouraged meaning of 1024 bytes. The latter binary usage originated as compromise technical jargon for byte multiples that needed to be expressed in a power of 2, but lacked a convenient name. As 1024 (2 ) is approximately 1000 (10 ), roughly corresponding to SI multiples, it was used for binary multiples as well. In 1998 the International Electrotechnical Commission (IEC) published standards for binary prefixes , requiring that
2565-558: A table or index. This allows split operations to be avoided or postponed. A record is an associated set of column values. Records are inserted and updated via Update operations and can be deleted via Delete operations. Columns are set and retrieved via SetColumns and RetrieveColumns operations, respectively. The maximum size of a record is 8110 bytes for 8 kilobyte pages with the exception of long value columns. Column types of LongText and LongBinary do not contribute significantly to this size limitation, and records can hold data much larger than
2660-495: A time in sorted order. Sorting is actually performed between the last record insertion and the first record retrieval. Temporary tables can be used for partial and complete result sets as well. These tables can offer the same features as base tables including the ability to navigate sequentially or directly to rows using index keys matching the sort definition. Temporary tables can also be updatable for computation of complex aggregates. Simple aggregates can be computed automatically with
2755-423: A transaction, using a pattern similar to the following: A transaction commit operation persists all the results of data manipulations within the scope of the transaction to the database. A transaction rollback operation does not persist the partial results of data manipulations within the scope of the transaction to the database. In no case can a partial transaction be committed to the database since that would leave
2850-402: A v1 ( JET Red ) and a v2 (JET Blue) that would conform to the same API specification (JET API). DAE became JET Blue for the color of the flag of Israel. BC7 ISAM became JET Red for the color of the flag of Russia. While JET Blue and JET Red were written to the same API specification, they shared no ISAM code whatsoever. They did both support a common query processor, QJET, which later together with
2945-450: A value. ESE tracks the change in a value rather than the end value of an update. Multiple sessions may each have outstanding changes made via EscrowUpdate to the same value because ESE can determine the actual end value regardless of which transactions commit and which transactions rollback. This allows multiple users to concurrently update a column by making numeric delta changes. Optionally, database engine can erase records with zero value of
Extensible Storage Engine - Misplaced Pages Continue
3040-478: A variant of nested transactions where the sub-transactions take place at different levels of a layered system architecture (e.g., with one operation at the database-engine level, one operation at the operating-system level). Another type of transaction is the compensating transaction . Transactions are available in most SQL database implementations, though with varying levels of robustness. For example, MySQL began supporting transactions from early version 3.23, but
3135-415: Is 2 GB. Version columns are automatically incremented by ESE each time a record containing this column is modified via an Update operation. This column cannot be set by the application, but can only be read. Applications of version columns include being used to determine if an in-memory copy of a given record needs to be refreshed. If the value in a table record is greater than the value in a cached copy then
3230-455: Is a DBMS that provides the ACID properties for a bracketed set of database operations (begin-commit). Transactions ensure that the database is always in a consistent state, even in the event of concurrent updates and failures. All the write operations within a transaction have an all-or-nothing effect, that is, either the transaction succeeds and all writes take effect, or otherwise, the database
3325-524: Is a collection of 2, 4, 8, 16, or 32 KB pages (16 and 32 KB page options are only available in Windows 7 and Exchange 2010), arranged in a balanced B-tree structure. These pages contain meta-data to describe the data contained within the database, data itself, indexes to persist interesting orders of the data, and other information. This information is intermixed within the database file but efforts are made to keep data used together clustered together within
3420-590: Is a homogeneous collection of records, where each record has the same set of columns. Each table is identified by a table name, whose scope is local to the database in which the table is contained. The amount of disk space allocated to a table within a database is determined by a parameter given when the table is created with the CreateTable operation. Tables grow automatically in response to data creation. Tables have one or more indexes. There must be at least one clustered index for record data. When no clustered index
3515-512: Is a logical pointer within a table index. The cursor may be positioned on a record, before the first record, after the last record or even between records. If a cursor is positioned before or after a record, there is no current record. It is possible to have multiple cursors into the same table index. Many record and column operations are based on the cursor position. Cursor position can be moved sequentially by Move operations or directly using index keys with Seek operations. Cursors can also be moved to
3610-572: Is brought to a state that does not include any of the writes of the transaction. Transactions also ensure that the effect of concurrent transactions satisfies certain guarantees, known as isolation level . The highest isolation level is serializability , which guarantees that the effect of concurrent transactions is equivalent to their serial (i.e. sequential) execution. Most modern relational database management systems support transactions. NoSQL databases prioritize scalability along with supporting transactions in order to guarantee data consistency in
3705-480: Is crucial, as it offers a virtually infinite pool of storage resources, accommodating a range of cloud-based data store classes with varying availability, scalability, and ACID properties. This integration is essential for achieving higher availability, lower response time, and cost efficiency in data-intensive applications deployed across cloud-based data stores. The Namesys Reiser4 filesystem for Linux supports transactions, and as of Microsoft Windows Vista ,
3800-514: Is defined by the application, an artificial index is used which orders and clusters records by the chronological order of record insertion. Indexes are defined to persist interesting orders of data, and allow both sequential access to records in index order, and direct access to records by index column values. Clustered indexes in ESE must also be primary, meaning that the index key must be unique. Clustered and non-clustered indexes are represented using B+ trees . If an insert or update operation causes
3895-425: Is described in terms of an array of columns, in precedence order. This array of columns is also called the index key. Each column is called an index segment. Each index segment may be either ascending or descending, in terms of its ordering contribution. Any number of indexes may be defined for a table. ESE provides a rich set of indexing features. One index may be specified as the clustered, or primary, index. In ESE,
Extensible Storage Engine - Misplaced Pages Continue
3990-490: Is important to understand the trade offs between the column categories. Fixed and variable columns are typically represented in every record, even when the occurrence has a NULL value. These columns can be quickly addressed via an offset table. Tagged column occurrences are preceded by a column identifier and the column is located by binary searching the set of tagged columns. Column types of Long Text and Long Binary are large binary objects. They are stored in separate B+tree from
4085-609: Is one billion bytes. The unit symbol for the gigabyte is GB . This definition is used in all contexts of science (especially data science ), engineering , business , and many areas of computing , including storage capacities of hard drives , solid-state drives , and tapes , as well as data transmission speeds. The term is also used in some fields of computer science and information technology to denote 1 073 741 824 (1024 or 2 ) bytes, however, particularly for sizes of RAM . Thus, some usage of gigabyte has been ambiguous. To resolve this difficulty, IEC 80000-13 clarifies that
4180-432: Is portable in that it can be detached from one running ESE instance and later attached to the same or a different running instance. While detached, a database may be copied using standard Windows utilities. The database cannot be copied while it is being actively used since ESE opens database files exclusively. A database may physically reside on any device supported for directly addressable I/O operations by Windows. A table
4275-420: Is required with streamed backups. Both the database and log files are check summed to ensure that no data corruptions exist within the data set during the backup process. Streaming backups may also be incremental backups. Incremental backups are ones in which only the log files are copied and which can be restored along with a previous full backup to bring all databases to a recent state. Shadow copy backups are
4370-510: The InnoDB storage engine was not default before version 5.5. The earlier available storage engine, MyISAM does not support transactions. A transaction is typically started using the command BEGIN (although the SQL standard specifies START TRANSACTION ). When the system processes a COMMIT statement, the transaction ends with successful completion. A ROLLBACK statement can also end
4465-593: The International System of Units (SI). This is the recommended definition by the International Electrotechnical Commission (IEC). This definition is used in networking contexts and most storage media , particularly hard drives , flash -based storage, and DVDs , and is also consistent with the other uses of the SI prefix in computing, such as CPU clock speeds or measures of performance . The file manager of Mac OS X version 10.6 and later versions are
4560-464: The ACID properties over multiple nodes, and might include systems such as databases, storage managers, file systems, messaging systems, and other data managers. In a distributed transaction there is typically an entity coordinating all the process to ensure that all parts of the transaction are applied to all relevant systems. Moreover, the integration of Storage as a Service (StaaS) within these environments
4655-538: The BC7 ISAM became synonymous with JET Red. JET Blue first shipped in 1994 as an ISAM for WINS, DHCP, and the now defunct RPL services in Windows NT 3.5. It shipped again as the storage engine for Microsoft Exchange in 1996. Additional Windows services chose JET Blue as their storage technology and by 2000 every version of Windows began to ship with JET Blue. JET Blue was used by Active Directory and became part of
4750-401: The ESE runtime shipping with x64 versions of Windows XP and Windows Server 2003 . Microsoft Exchange , up to Exchange 2003 shipped with only the 32-bit edition, as it was the only supported platform. With Exchange 2007 , it ships with the 64-bit edition. A database is both a physical and logical grouping of data. An ESE database looks like a single file to Windows. Internally the database
4845-456: The GetLock operation. In addition, an advanced concurrency control feature known as escrow locking is supported by ESE. Escrow locking is an extremely concurrent update where a numeric value is changed in a relative fashion, i.e. by adding or subtracting another numeric value. Escrow updates are non-conflicting even with other concurrent escrow updates to the same datum. This is possible because
SECTION 50
#17327985307364940-611: The Microsoft NTFS filesystem supports distributed transactions across networks. There is occurring research into more data coherent filesystems, such as the Warp Transactional Filesystem (WTF). Gigabyte The gigabyte ( / ˈ ɡ ɪ ɡ ə b aɪ t , ˈ dʒ ɪ ɡ ə b aɪ t / ) is a multiple of the unit byte for digital information. The prefix giga means 10 in the International System of Units (SI). Therefore, one gigabyte
5035-414: The amount of disk space needed for the log but has implications on the ability to recreate a data state in the event of a media failure. Logging and recovery also play a role in protecting data from media failure. ESE supports on-line backup where one or more databases are copied, along with log files in a manner that does not affect database operations. Databases can continue to be queried and updated while
5130-505: The backup is being made. The backup is referred to as a ‘fuzzy backup’ because the recovery process must be run as part of backup restoration to restore a consistent set of databases. Both streaming and shadow copy backup are supported. Streaming backup is a backup method where copies of all desired database files and the necessary log files are made during the backup process. File copies may be saved directly to tape or can be made to any other storage device. No quiescing of activity of any kind
5225-453: The binary and decimal definitions used for "gigabyte" have ended in favour of the manufacturers, with courts holding that the legal definition of gigabyte or GB is 1 GB = 1,000,000,000 (10 ) bytes (the decimal definition). Specifically, the courts held that "the U.S. Congress has deemed the decimal definition of gigabyte to be the 'preferred' one for the purposes of 'U.S. trade and commerce' .... The California Legislature has likewise adopted
5320-436: The cached copy is known to be out of date. Version columns must be of type Long. Auto increment columns are automatically set by ESE such that the value contained in the column is unique for every record in the table. These columns, like version columns, cannot be set by the application. Auto increment columns are read only, and are automatically set when a new record is inserted into a table via an Update operation. The value in
5415-873: The capacity of modern computer random-access memory devices, such as DIMM modules, is always a multiple of a power of 1024. It is thus convenient to use prefixes denoting powers of 1024, known as binary prefixes , in describing them. For example, a memory capacity of 1 073 741 824 bytes (1024 B) is conveniently expressed as 1 GiB rather than as 1.074 GB. The former specification is, however, often quoted as "1 GB" when applied to random-access memory. Software allocates memory in varying degrees of granularity as needed to fulfill data structure requirements and binary multiples are usually not required. Other computer capacities and rates, like storage hardware size, data transfer rates, clock speeds , operations per second , etc., do not depend on an inherent base , and are usually presented in decimal units. For example,
5510-460: The class designation. Practically all manufacturers of hard disk drives and flash-memory disk devices continue to define one gigabyte as 1 000 000 000 bytes , which is displayed on the packaging. Some operating systems such as Mac OS X and Ubuntu , and Debian express hard drive capacity or file size using decimal multipliers, while others such as Microsoft Windows report size using binary multipliers. This discrepancy causes confusion, as
5605-411: The clustered index keyed by long value id and byte offset. ESE supports append, byte range overwrite, and set size for these columns. Also, ESE has a single instance store feature where multiple records may reference the same large binary object, as though each record had its own copy of the information, i.e. without inter-record locking conflicts. The maximum size of a Long Text or Long Binary column value
5700-406: The clustered index must be unique and is referred to as the primary index. Other indexes are described as non-clustered, or secondary, indexes. Primary indexes are different from secondary indexes in that the index entry is the record itself, and not a logical pointer to the record. Secondary indexes have primary keys at their leaves to logically link to the record in the primary index. In other words,
5795-408: The column remains constant for the life of the record, and only one auto increment column is allowed per table. Auto increment columns may be of type Long or type Currency. Escrow columns can be modified via an EscrowUpdate operation. Escrowed updates are numeric delta operations. Escrow columns must be of type Long. Examples of numeric delta operations include adding 2 to a value or subtracting 1 from
SECTION 60
#17327985307365890-428: The column. A common use for such escrow column is reference counter: many threads increment/decrement the value without locks, and when the counter reaches zero, the record automatically gets deleted. An index is a persisted ordering of records in a table. Indexes are used for both sequential access to rows in the order defined, and for direct record navigation based on indexed column values. The order defined by an index
5985-477: The copy buffer do not automatically change the stored data. The contents of the current record can be copied into the copy buffer using the PrepareUpdate operation, and Update operations store the contents of the copy buffer as a record. The copy buffer is implicitly cleared on a transaction commit or rollback, as well as on navigation operations. RetrieveColumns may be used to retrieve column data either from
6080-434: The database in an inconsistent state. Internally, multi-user databases store and process transactions, often by using a transaction ID or XID. There are multiple varying ways for transactions to be implemented other than the simple way documented above. Nested transactions , for example, are transactions which contain statements within them that start new transactions (i.e. sub-transactions). Multi-level transactions are
6175-515: The database), isolated (it must not affect other transactions) and durable (it must get written to persistent storage). Database practitioners often refer to these properties of database transactions using the acronym ACID . Databases and other data stores which treat the integrity of data as paramount often include the ability to handle transactions to maintain the integrity of data. A single transaction consists of one or more independent units of work, each reading and/or writing information to
6270-540: The database. An ESE database may contain up to 2 pages, or 16 terabytes of data, for 8 kilobyte sized pages. ESE databases are organized into groups called instances. Most applications use a single instance, but all applications can also use multiple instances. The importance of the instance is that it associates a single recovery log series with one or more databases. Currently, up to 6 user databases may be attached to an ESE instance at any time. Each separate process using ESE may have up to 1024 ESE instances. A database
6365-499: The decimal kilobyte value is nearly 98% of the kibibyte, a megabyte is under 96% of a mebibyte, and a gigabyte is just over 93% of a gibibyte value. This means that a 300 GB (279 GiB) hard disk might be indicated variously as "300 GB", "279 GB" or "279 GiB", depending on the operating system. As storage sizes increase and larger units are used, these differences become more pronounced. A lawsuit decided in 2019 that arose from alleged breach of contract and other claims over
6460-445: The decimal system for all 'transactions in this state'." Earlier lawsuits had ended in settlement with no court ruling on the question, such as a lawsuit against drive manufacturer Western Digital . Western Digital settled the challenge and added explicit disclaimers to products that the usable capacity may differ from the advertised capacity. Seagate was sued on similar grounds and also settled. Because of their physical design,
6555-409: The event of a system crash. Logging is the process of redundantly recording database update operations in a log file. The log file structure is very robust against system crashes. Recovery is the process of using this log to restore databases to a consistent state after a system crash. Transaction operations are logged and the log is flushed to disk during each commit to transaction level 0. This allows
6650-405: The event of concurrent updates and accesses. In a database system, a transaction might consist of one or more data-manipulation statements and queries, each reading and/or writing information in the database. Users of database systems consider consistency and integrity of data as highly important. A simple transaction is usually issued to the database system in a language like SQL wrapped in
6745-471: The first disk drive, the IBM 350 , disk drive manufacturers expressed hard drive capacities using decimal prefixes. With the advent of gigabyte-range drive capacities, manufacturers labelled many consumer hard drive , solid-state drive and USB flash drive capacities in certain size classes expressed in decimal gigabytes, such as "500 GB". The exact capacity of a given drive model is usually slightly larger than
6840-441: The following two entries to cover the single transaction: A transactional system would make both entries pass or both entries would fail. By treating the recording of multiple entries as an atomic transactional unit of work the system maintains the integrity of the data recorded. In other words, nobody ends up with a situation in which a debit is recorded but no associated credit is recorded, or vice versa. A transactional database
6935-506: The form: find all records containing “JET Blue” . They can be used for sub-strings longer than the maximum tuple length by dividing the search sub-string into maximum tuple length search strings and intersecting the results. They can be used for exact matches for strings as long as the maximum tuple length or as short as the minimum tuple length, with no index intersection. For more information on performing index intersection in ESE see Index Intersection . Tuple indexes cannot speed queries where
7030-532: The gigabyte strictly denote 1000 bytes and gibibyte denote 1024 bytes. By the end of 2007, the IEC Standard had been adopted by the IEEE , EU , and NIST , and in 2009 it was incorporated in the International System of Quantities . Nevertheless, the term gigabyte continues to be widely used with the following two different meanings: Based on powers of 10, this definition uses the prefix giga- as defined in
7125-433: The indexed column. Multi-valued columns may be indexed in conjunction with single valued columns. When two or more multi-valued columns are indexed together, then the multi-valued property is only honored for the first multi-value column in the index. Lower precedence columns are treated as though they were single valued. Indexes can also be defined to be sparse. Sparse indexes do not have at least one entry for each record in
7220-443: The join. This process can be extended to a large number of logical tables as ESE can support up to 64,993 tagged columns. Since indexes can be defined over multi-valued columns, it is still possible to index ‘interior’ tables. However, some limitations exist and applications should consider pre-joining carefully before employing this technique. The logging and recovery feature of ESE supports guaranteed data integrity and consistency in
7315-582: The makers of electronic storage devices must conform to Microsoft Windows' use of a binary definition of "GB" instead of the metric/decimal definition, the United States District Court for the Northern District of California rejected that argument, ruling that "the U.S. Congress has deemed the decimal definition of gigabyte to be the 'preferred' one for the purposes of 'U.S. trade and commerce. ' " The term gigabyte has
7410-500: The meantime; else the operation fails at once without waiting. Read-only transactions never need to wait, and update transactions can interfere only with one another updating transaction. Transactions which are terminated by Rollback, or by a system crash, leave no trace on the database. In general, the data state is restored on Rollback to what it was prior to BeginTransaction. Transactions may be nested up to 7 levels, with one additional level reserved for ESE internal use. This means that
7505-422: The middle of an index, as determined by the primary index order, may be very much slower than appending it to the end of an index. Update frequency must be carefully considered against retrieval patterns when performing table design. If no primary index is defined for a table, then an implicit primary index, called a database key (DBK) index is created. The DBK is simply a unique ascending number incremented each time
7600-622: The next year a team of four developers worked for Allen to largely complete the ISAM. Microsoft already had the BC7 ISAM (JET Red) but began the Data Access Engine (DAE) effort to build a more robust database engine as an entry in the then new client-server architecture realm. In the spring of 1990, BC7 ISAM and DAE teams were joined to become the Joint Engine Technology (JET) effort; responsible for producing two engines
7695-416: The operations supported are commutable and can be independently committed or rolled back. As a result, they do not interfere with concurrent update transactions. This feature is often used for maintained aggregations. ESE also extends transaction semantics from data manipulation operations to data definition operations. It is possible to add an index to a table and have concurrently running transactions update
7790-445: The original column value. Normalization is not always reversible. For example, Text and Long Text column types cannot be denormalized. In addition, index keys may be truncated when column data is very long. In cases where columns cannot be retrieved directly from secondary indexes, the record can always be accessed to retrieve the necessary data. Queries often involve a combination of restrictions on data. An efficient means of processing
7885-403: The record or from the copy buffer, if one exists. ESE applications invariably query their data. This section of the document describes features and techniques for applications to write query procession logic on ESE. ESE provides a sort capability in the form of temporary tables. The application inserts data records into the sort process one record at a time, and then retrieves them one record at
7980-509: The recovery process to redo updates made by transactions which commit to transaction level 0, and undo changes made by transactions which did not commit to transaction level 0. This type of recovery scheme is often referred to as a ‘roll-forward/roll-backward’ recovery scheme. Logs can be retained until the data is safely copied via a backup process described below, or logs can be reused in a circular fashion as soon as they are no longer needed for recovery from system crash. Circular logging minimizes
8075-433: The residual predicate. Index intersection is an important query mechanism in which multiple indexes are used together to more efficiently process a complex restriction. Instead using only a single index, index ranges on multiple indexes are combined to result in a much smaller number of records on which any residual predicate can be applied. ESE makes this easy by supplying an IntersectIndexes operation. This operation accepts
8170-399: The same machine, or even the same machine configuration. Location of files can be changed as part of the restoration process. When an ESENT database is created, the physical disk sector size is stored with the database. The physical sector size is expected to remain consistent between sessions; otherwise, an error is reported. When a physical drive is cloned or restored from a drive image to
8265-585: The same table without any transaction lock contention whatsoever. Later, when these transactions are complete, the newly created index is available to all transactions and has entries for record updates made by other transactions that could not perceive the presence of the index when the updates took place. Data definition operations may be performed with all the features expected of the transaction mechanism for record updates. Data definition operations supported in this fashion include AddColumn, DeleteColumn, CreateIndex, DeleteIndex, CreateTable and DeleteTable. A cursor
8360-457: The search string is shorter than the minimum tuple length. A transaction is a logical unit of processing delimited by BeginTransaction and CommitTransaction, or Rollback, operations. All updates performed during a transaction are atomic; they either all appear in the database at the same time or none appear. Any subsequent updates by other transactions are invisible to a transaction. However, a transaction can update only data that has not changed in
8455-481: The start and the commit or rollback . After starting a transaction, database records or objects are locked, either read-only or read-write. Reads and writes can then occur. Once the transaction is fully defined, changes are committed or rolled back atomically , such that at the end of the transaction there is no inconsistency . Database systems implement distributed transactions as transactions accessing data over multiple nodes. A distributed transaction enforces
8550-399: The table is physically clustered in primary index order. Retrieval of non-indexed record data in primary index order is generally much faster than in secondary index order. This is because a single disk access can bring into memory multiple records that will be access close together in time. The same disk access satisfies multiple record access operations. However, the insertion of a record into
8645-478: The table. There are a number of options in defining a sparse index. Options exist to exclude records from indexes when an entire index key is NULL, when any key segment is NULL or when just the first key segment is NULL. Indexes can also have conditional columns. These columns never appear within an index but can cause a record not to be indexed when the conditional column is either NULL or non-NULL. Indexes can also be defined to include one entry for each sub-string of
8740-446: The transaction has ended. At the lowest level ( READ UNCOMMITTED ), which may occasionally be used to ensure high concurrency, such changes will be immediately visible. Relational databases are traditionally composed of tables with fixed-size fields and records. Object databases comprise variable-sized blobs , possibly serializable or incorporating a mime-type . The fundamental similarities between Relational and Object databases are
8835-413: The transaction is synchronously flushed to the log to ensure that the transaction will be completed even in the event of a subsequent system crash. Synchronously flushing the log makes ESE transactions durable. However, in some cases application wish to order their updates, but not immediately guarantee that changes will be done. Here, applications can commit changes with JET_bitIndexLazyFlush. ESE supports
8930-452: The transaction, undoing any work performed since BEGIN . If autocommit was disabled with the start of a transaction, autocommit will also be re-enabled with the end of the transaction. One can set the isolation level for individual transactional operations as well as globally. At the highest level ( READ COMMITTED ), the result of any operation performed after a transaction has started will remain invisible to other database users until
9025-562: Was never used in this role. Instead, it went on to be used by Exchange Server, Active Directory, File Replication Service (FRS), Security Configuration Editor, Certificate Services, Windows Internet Name Service (WINS) and a host of other Microsoft services, applications and Windows components. For years, it was a private API used by Microsoft only, but has since become a published API that anyone can use. Work began on Data Access Engine (DAE) in March 1989 when Allen Reiter joined Microsoft. Over
#735264