亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? optimizer.tcl

?? sqlite庫
?? TCL
字號:
## Run this TCL script to generate HTML for the goals.html file.#set rcsid {$Id: optimizer.tcl,v 1.1 2005/08/30 22:44:06 drh Exp $}source common.tclheader {The SQLite Query Optimizer}proc CODE {text} {  puts "<blockquote><pre>"  puts $text  puts "</pre></blockquote>"}proc IMAGE {name {caption {}}} {  puts "<center><img src=\"$name\">"  if {$caption!=""} {    puts "<br>$caption"  }  puts "</center>"}proc PARAGRAPH {text} {  puts "<p>$text</p>\n"}proc HEADING {level name} {  puts "<h$level>$name</h$level>"}HEADING 1 {The SQLite Query Optimizer}PARAGRAPH {  This article describes how the SQLite query optimizer works.  This is not something you have to know in order to use SQLite - many  programmers use SQLite successfully without the slightest hint of what  goes on in the inside.  But a basic understanding of what SQLite is doing  behind the scenes will help you to write more efficient SQL.  And the  knowledge gained by studying the SQLite query optimizer has broad  application since most other relational database engines operate   similarly.  A solid understanding of how the query optimizer works is also  required before making meaningful changes or additions to the SQLite, so   this article should be read closely by anyone aspiring  to hack the source code.}HEADING 2 BackgroundPARAGRAPH {  It is important to understand that SQL is a programming language.  SQL is a perculiar programming language in that it  describes <u>what</u> the programmer wants to compute not <u>how</u>  to compute it as most other programming languages do.  But perculiar or not, SQL is still just a programming language.}PARAGRAPH {  It is very helpful to think of each SQL statement as a separate  program.  An important job of the SQL database engine is to translate each  SQL statement from its descriptive form that specifies what the  information is desired (the <u>what</u>)   into a procedural form that specifies how to go  about acquiring the desired information (the <u>how</u>).  The task of translating the <u>what</u> into a   <u>how</u> is assigned to the query optimizer.}PARAGRAPH {  The beauty of SQL comes from the fact that the optimizer frees the programmer  from having to worry over the details of <u>how</u>.  The programmer  only has to specify the <u>what</u> and then leave the optimizer  to deal with all of the minutae of implementing the  <u>how</u>.  Thus the programmer is able to think and work at a  much higher level and leave the optimizer to stress over the low-level  work.}HEADING 2 {Database Layout}PARAGRAPH {  An SQLite database consists of one or more "b-trees".  Each b-tree contains zero or more "rows".   A single row contains a "key" and some "data".  In general, both the key and the data are arbitrary binary  data of any length.  The keys must all be unique within a single b-tree.  Rows are stored in order of increasing key values - each  b-tree has a comparision functions for keys that determines  this order.}PARAGRAPH {  In SQLite, each SQL table is stored as a b-tree where the  key is a 64-bit integer and the data is the content of the  table row.  The 64-bit integer key is the ROWID.  And, of course,  if the table has an INTEGER PRIMARY KEY, then that integer is just  an alias for the ROWID.}PARAGRAPH {  Consider the following block of SQL code:}CODE {  CREATE TABLE ex1(     id INTEGER PRIMARY KEY,     x  VARCHAR(30),     y  INTEGER  );  INSERT INTO ex1 VALUES(NULL,'abc',12345);  INSERT INTO ex1 VALUES(NULL,456,'def');  INSERT INTO ex1 VALUES(100,'hello','world');  INSERT INTO ex1 VALUES(-5,'abc','xyz');  INSERT INTO ex1 VALUES(54321,NULL,987);}PARAGRAPH {  This code generates a new b-tree (named "ex1") containing 5 rows.  This table can be visualized as follows:}IMAGE table-ex1b2.gifPARAGRAPH {  Note that the key for each row if the b-tree is the INTEGER PRIMARY KEY  for that row.  (Remember that the INTEGER PRIMARY KEY is just an alias  for the ROWID.)  The other fields of the table form the data for each  entry in the b-tree.  Note also that the b-tree entries are in ROWID order  which is different from the order that they were originally inserted.}PARAGRAPH {  Now consider the following SQL query:}CODE {  SELECT y FROM ex1 WHERE x=456;}PARAGRAPH {  When the SQLite parser and query optimizer are handed this query, they  have to translate it into a procedure that will find the desired result.  In this case, they do what is call a "full table scan".  They start  at the beginning of the b-tree that contains the table and visit each  row.  Within each row, the value of the "x" column is tested and when it  is found to match 456, the value of the "y" column is output.  We can represent this procedure graphically as follows:}IMAGE fullscanb.gifPARAGRAPH {  A full table scan is the access method of last resort.  It will always  work.  But if the table contains millions of rows and you are only looking  a single one, it might take a very long time to find the particular row  you are interested in.  In particular, the time needed to access a single row of the table is  proportional to the total number of rows in the table.  So a big part of the job of the optimizer is to try to find ways to   satisfy the query without doing a full table scan.}PARAGRAPH {  The usual way to avoid doing a full table scan is use a binary search  to find the particular row or rows of interest in the table.  Consider the next query which searches on rowid instead of x:}CODE {  SELECT y FROM ex1 WHERE rowid=2;}PARAGRAPH {  In the previous query, we could not use a binary search for x because  the values of x were not ordered.  But the rowid values are ordered.  So instead of having to visit every row of the b-tree looking for one  that has a rowid value of 2, we can do a binary search for that particular  row and output its corresponding y value.  We show this graphically  as follows:}IMAGE direct1b.gifPARAGRAPH {  When doing a binary search, we only have to look at a number of  rows with is proportional to the logorithm of the number of entries  in the table.  For a table with just 5 entires as in the example above,  the difference between a full table scan and a binary search is  negligible.  In fact, the full table scan might be faster.  But in  a database that has 5 million rows, a binary search will be able to  find the desired row in only about 23 tries, whereas the full table  scan will need to look at all 5 million rows.  So the binary search  is about 200,000 times faster in that case.}PARAGRAPH {  A 200,000-fold speed improvement is huge.  So we always want to do  a binary search rather than a full table scan when we can.}PARAGRAPH {  The problem with a binary search is that the it only works if the  fields you are search for are in sorted order.  So we can do a binary  search when looking up the rowid because the rows of the table are  sorted by rowid.  But we cannot use a binary search when looking up  x because the values in the x column are in no particular order.}PARAGRAPH {  The way to work around this problem and to permit binary searching on  fields like x is to provide an index.  An index is another b-tree.  But in the index b-tree the key is not the rowid but rather the field  or fields being indexed followed by the rowid.  The data in an index b-tree is empty - it is not needed or used.  The following diagram shows an index on the x field of our example table:}IMAGE index-ex1-x-b.gifPARAGRAPH {  An important point to note in the index are that they keys of the  b-tree are in sorted order.  (Recall that NULL values in SQLite sort  first, followed by numeric values in numerical order, then strings, and  finally BLOBs.)  This is the property that will allow use to do a  binary search for the field x.  The rowid is also included in every  key for two reasons.  First, by including the rowid we guarantee that  every key will be unique.  And second, the rowid will be used to look  up the actual table entry after doing the binary search.  Finally, note  that the data portion of the index b-tree serves no purpose and is thus  kept empty to save space in the disk file.}PARAGRAPH {  Remember what the original query example looked like:}CODE {  SELECT y FROM ex1 WHERE x=456;}PARAGRAPH {  The first time this query was encountered we had to do a full table  scan.  But now that we have an index on x, we can do a binary search  on that index for the entry where x==456.  Then from that entry we  can find the rowid value and use the rowid to look up the corresponding  entry in the original table.  From the entry in the original table,  we can find the value y and return it as our result.  The following  diagram shows this process graphically:}IMAGE indirect1b1.gifPARAGRAPH {  With the index, we are able to look up an entry based on the value of  x after visiting only a logorithmic number of b-tree entries.  Unlike  the case where we were searching using rowid, we have to do two binary  searches for each output row.  But for a 5-million row table, that is  still only 46 searches instead of 5 million for a 100,000-fold speedup.}HEADING 3 {Parsing The WHERE Clause}# parsing the where clause# rowid lookup# index lookup# index lookup without the table# how an index is chosen# joins# join reordering# order by using an index# group by using an index# OR -> IN optimization# Bitmap indices# LIKE and GLOB optimization# subquery flattening# MIN and MAX optimizations

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲捆绑美女| 18欧美亚洲精品| 2021中文字幕一区亚洲| 国产精品三级av| 亚洲图片一区二区| 国产尤物一区二区| 91丨国产丨九色丨pron| 99视频精品在线| 91精品国产福利在线观看| 国产亚洲精品免费| 亚洲一级电影视频| 成人小视频在线| 日韩一区二区中文字幕| 亚洲欧洲av色图| 奇米影视在线99精品| 99久久国产综合精品麻豆| 91精品国产高清一区二区三区蜜臀 | 午夜精品久久一牛影视| 狠狠色伊人亚洲综合成人| 91麻豆免费视频| 久久亚洲综合色一区二区三区| 精品久久久久久无| 亚洲午夜久久久久| 成人黄色一级视频| 精品久久五月天| 亚洲成av人片在线观看无码| 成人高清在线视频| 欧美大片在线观看一区| 亚洲va欧美va天堂v国产综合| 成人国产电影网| 国产婷婷一区二区| 久草热8精品视频在线观看| 欧美日本在线看| 国产精品久久久爽爽爽麻豆色哟哟 | 一区二区高清在线| 成人久久视频在线观看| 精品国产污网站| 视频一区中文字幕国产| 欧美日韩亚洲不卡| 亚洲一区中文日韩| 91免费精品国自产拍在线不卡| 国产欧美视频一区二区| 韩国欧美国产一区| 久久色.com| 国产成人自拍网| 久久精品在线观看| 国产成人午夜视频| 日韩免费一区二区| 精品综合久久久久久8888| 欧美一区二区成人| 美女精品一区二区| 欧美一卡二卡三卡| 黑人精品欧美一区二区蜜桃| 3751色影院一区二区三区| 午夜激情久久久| 欧美人xxxx| 六月婷婷色综合| 精品国产成人系列| 国产成人免费av在线| 国产区在线观看成人精品 | 欧美一区二区三区四区视频| 奇米精品一区二区三区在线观看| 欧美老肥妇做.爰bbww| 亚洲成年人影院| 欧美一区二区视频网站| 老司机精品视频在线| 2017欧美狠狠色| 成人黄动漫网站免费app| 欧美一级高清大全免费观看| 国产一区二区三区在线观看免费 | 亚洲六月丁香色婷婷综合久久 | 一区二区高清在线| 91精品国产色综合久久久蜜香臀| 美女性感视频久久| 国产精品少妇自拍| 色综合色狠狠综合色| 亚洲国产乱码最新视频 | 亚洲最快最全在线视频| 在线播放一区二区三区| 精品亚洲免费视频| 亚洲天堂免费看| 日韩丝袜情趣美女图片| 国产成人av一区二区三区在线 | 最新日韩av在线| 欧美午夜片在线看| 国产剧情一区在线| 亚洲尤物在线视频观看| 欧美精品一区二区三区高清aⅴ| av一区二区三区在线| 免费高清在线视频一区·| 国产精品久久久久久久久晋中| 在线免费观看日本一区| 国产在线日韩欧美| 亚洲一线二线三线久久久| 国产亚洲精品资源在线26u| 久久精品人人做人人综合| 韩国av一区二区| 亚洲gay无套男同| 亚洲激情校园春色| 亚洲欧美在线aaa| 欧美激情在线观看视频免费| 欧美大片一区二区三区| 欧美人体做爰大胆视频| 在线看国产一区二区| 色综合视频在线观看| 成人av在线电影| 国产成人免费视频一区| 国产精一品亚洲二区在线视频| 日韩精彩视频在线观看| 午夜a成v人精品| 亚洲6080在线| 三级欧美韩日大片在线看| 婷婷综合久久一区二区三区| 天天色天天爱天天射综合| 亚洲综合成人在线| 亚洲伊人色欲综合网| 夜夜夜精品看看| 亚洲一区二区三区在线播放 | 欧美一级片在线看| 91精品国产色综合久久不卡蜜臀 | 宅男噜噜噜66一区二区66| 欧美日韩免费不卡视频一区二区三区| 日本韩国精品在线| 欧美色图激情小说| 欧美日韩精品一区二区在线播放| 欧美视频精品在线观看| 欧美夫妻性生活| 日韩三级在线观看| 久久久精品免费网站| 欧美激情一区不卡| 亚洲乱码国产乱码精品精的特点| 亚洲伊人色欲综合网| 日本欧美一区二区在线观看| 黄页视频在线91| 成人开心网精品视频| 日本韩国精品一区二区在线观看| 欧美日韩在线精品一区二区三区激情 | 日韩高清欧美激情| 韩国毛片一区二区三区| 不卡视频免费播放| 精品视频一区二区三区免费| 日韩欧美中文字幕一区| 日本一区二区免费在线观看视频 | 老司机免费视频一区二区三区| 国产在线一区观看| 99国产精品久久久| 91精品国产综合久久香蕉的特点 | 2023国产精华国产精品| 中文字幕在线观看不卡| 偷拍自拍另类欧美| 国产成人鲁色资源国产91色综 | 五月婷婷激情综合网| 极品少妇xxxx精品少妇| 91蝌蚪国产九色| 欧美tickling挠脚心丨vk| **欧美大码日韩| 久久激五月天综合精品| 在线观看日韩精品| 日本一区二区三区在线不卡| 日韩成人免费看| 色综合色狠狠天天综合色| 久久先锋影音av| 亚洲电影一区二区三区| 成人一级黄色片| 日韩欧美中文一区| 亚洲综合色丁香婷婷六月图片| 国产精品一区二区三区99| 这里只有精品免费| 亚洲狼人国产精品| 成人综合在线观看| 日韩精品自拍偷拍| 亚洲成人动漫在线免费观看| 丁香激情综合国产| 欧美电影免费观看高清完整版在| 亚洲综合一区在线| av在线不卡免费看| 久久久久国产免费免费| 蜜臀av一区二区三区| 欧美日本一道本在线视频| 亚洲色图另类专区| 国产成人8x视频一区二区| 欧美xxxxxxxxx| 日本午夜精品一区二区三区电影 | av影院午夜一区| 国产调教视频一区| 久久国内精品视频| 69堂亚洲精品首页| 日韩中文字幕一区二区三区| 色偷偷一区二区三区| 中文字幕人成不卡一区| 国产高清久久久久| 久久久久国产免费免费| 加勒比av一区二区| 久久久国际精品| 国产精品一线二线三线| 久久精品一二三| 国产成人综合视频| 中文字幕一区在线观看视频| 波多野结衣视频一区| 中文字幕五月欧美|