123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html><head>
- <title>SQLite Query Language: INDEXED BY</title>
- <style type="text/css">
- body {
- margin: auto;
- font-family: Verdana, sans-serif;
- padding: 8px 1%;
- }
- a { color: #45735f }
- a:visited { color: #734559 }
- .logo { position:absolute; margin:3px; }
- .tagline {
- float:right;
- text-align:right;
- font-style:italic;
- width:240px;
- margin:12px;
- margin-top:58px;
- }
- .toolbar {
- font-variant: small-caps;
- text-align: center;
- line-height: 1.6em;
- margin: 0;
- padding:1px 8px;
- }
- .toolbar a { color: white; text-decoration: none; padding: 6px 12px; }
- .toolbar a:visited { color: white; }
- .toolbar a:hover { color: #80a796; background: white; }
- .content { margin: 5%; }
- .content dt { font-weight:bold; }
- .content dd { margin-bottom: 25px; margin-left:20%; }
- .content ul { padding:0px; padding-left: 15px; margin:0px; }
- /* rounded corners */
- .se { background: url(images/se.png) 100% 100% no-repeat #80a796}
- .sw { background: url(images/sw.png) 0% 100% no-repeat }
- .ne { background: url(images/ne.png) 100% 0% no-repeat }
- .nw { background: url(images/nw.png) 0% 0% no-repeat }
- </style>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-
- </head>
- <body>
- <div><!-- container div to satisfy validator -->
- <a href="lang.html">
- <h2 align="center">SQL As Understood By SQLite</h2></a><h1>INDEXED BY</h1>
- <p>The INDEXED BY phrase is a SQL extension found only in SQLite which can
- be used to verify that the correct indices are being used on a <a href="lang_delete.html">DELETE</a>,
- <a href="lang_select.html">SELECT</a>, or <a href="lang_update.html">UPDATE</a> statement.
- The INDEXED BY phrase always follows the name of a table that SQLite will
- be reading. The INDEXED BY phrase can be seen in the following syntax
- diagrams:</p>
- <h4><a href="syntaxdiagrams.html#qualified-table-name">qualified-table-name:</a></h4><blockquote> <img alt="syntax diagram qualified-table-name" src="images/syntax/qualified-table-name.gif"></img> </blockquote>
- <h4><a href="syntaxdiagrams.html#single-source">single-source:</a></h4><blockquote> <img alt="syntax diagram single-source" src="images/syntax/single-source.gif"></img> </blockquote>
- <p>The "INDEXED BY index-name" clause specifies that the named index
- must be used in order to look up values on the preceding table.
- If index-name does not exist or cannot be used for the query, then
- the preparation of the SQL statement fails.
- The "NOT INDEXED" clause specifies that no index shall be used when
- accessing the preceding table, including implied indices create by
- UNIQUE and PRIMARY KEY constraints. However, the INTEGER PRIMARY KEY
- can still be used to look up entries even when "NOT INDEXED" is specified.</p>
- <p>Some SQL database engines provide non-standard "hint" mechanisms which
- can be used to give the query optimizer clues about what indices it should
- use for a particular statement. The INDEX BY clause of SQLite is
- <em>not</em> a hinting mechanism and it should not be used as such.
- The INDEXED BY clause does not give the optimizer hints about which index
- to use; it gives the optimizer a requirement of which index to use.
- If the query optimizer is unable to use the index specified by the
- INDEX BY clause, then the query will fail with an error.</p>
- <p>The INDEXED BY clause is <em>not</em> intended for use in tuning
- the preformance of a query. The intent of the INDEXED BY clause is
- to raise a run-time error if a schema change, such as dropping or
- creating an index, causes the query plan for a time-sensitive query
- to change. The INDEXED BY clause is designed to help detect
- undesirable query plan changes during regression testing.
- Developers are admonished to omit all use of INDEXED BY during
- application design, implementation, testing, and tuning. If
- INDEXED BY is to be used at all, it should be inserted at the very
- end of the development process when "locking down" a design.</p>
- <h3>See Also:</h3>
- <p>The sqlite3_stmt_status() C/C++ interface together with the
- SQLITE_STMTSTATUS_FULLSCAN_STEP and SQLITE_STMTSTATUS_SORT verbs
- can be used to detect at run-time when an SQL statement is not
- making effective use of indices. Many applications may prefer to
- use the sqlite3_stmt_status() interface to detect index misuse
- rather than the INDEXED BY phrase described here.</p>
- <DIV class="pdf_section">
|