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

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

?? optimizer.tcl

?? sqlite在uc上的移植,編譯器為arm-elf,可直接使用的
?? 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一区二区三区免费野_久草精品视频
亚洲影院理伦片| 欧美日韩1234| 成人av在线看| 国产成人99久久亚洲综合精品| 国产一区二区女| 国产麻豆精品久久一二三| 精品一二三四区| 狠狠久久亚洲欧美| 国产91精品久久久久久久网曝门| 成人午夜视频免费看| 成人av免费观看| 色婷婷综合久久久中文一区二区| 色综合久久久久综合体桃花网| 日本福利一区二区| 欧美日韩精品电影| 欧美一级电影网站| 久久综合九色综合97婷婷女人| 久久人人97超碰com| 国产婷婷色一区二区三区在线| 国产精品视频免费看| 亚洲精品一卡二卡| 午夜精品一区二区三区三上悠亚| 日韩成人一级大片| 国产一区 二区| 91网页版在线| 91精品国产aⅴ一区二区| 欧美不卡一区二区三区| 亚洲国产精品ⅴa在线观看| 国产精品天干天干在观线| 亚洲欧美aⅴ...| 婷婷六月综合亚洲| 国产激情精品久久久第一区二区| 国产91精品久久久久久久网曝门 | 色婷婷综合久久久久中文| 色婷婷精品久久二区二区蜜臀av | 欧美疯狂做受xxxx富婆| 精品国产伦一区二区三区观看方式 | 亚洲成人精品一区| 蜜桃视频免费观看一区| 国产mv日韩mv欧美| 欧美三区免费完整视频在线观看| 欧美乱妇15p| 久久久亚洲高清| 亚洲自拍偷拍九九九| 国产一区二区三区香蕉| 97久久精品人人做人人爽| 欧美剧情片在线观看| 国产欧美一区二区精品久导航| 亚洲免费三区一区二区| 精品一区二区在线播放| 91在线视频播放地址| 91精品国模一区二区三区| 国产三级一区二区三区| 午夜影院在线观看欧美| 国产激情视频一区二区三区欧美| 精品乱人伦小说| 亚洲视频香蕉人妖| 激情综合一区二区三区| 欧美在线观看视频在线| 国产婷婷精品av在线| 日日夜夜一区二区| av色综合久久天堂av综合| 日韩一区二区三区视频在线 | 男女男精品视频网| aaa欧美色吧激情视频| 日韩欧美一二三区| 亚洲国产综合色| 国产精品系列在线观看| 欧美一级日韩免费不卡| 亚洲品质自拍视频| 国产精一区二区三区| 91精品国产一区二区三区| 亚洲色图.com| 懂色av一区二区在线播放| 日韩免费视频一区二区| 亚洲一区二区三区自拍| 国产91高潮流白浆在线麻豆| 日韩免费看的电影| 五月激情综合网| 在线视频欧美精品| 成人欧美一区二区三区黑人麻豆| 国内偷窥港台综合视频在线播放| 欧美精品三级在线观看| 亚洲色图第一区| 成人精品视频网站| 国产欧美一区二区三区鸳鸯浴| 免费人成在线不卡| 欧美久久免费观看| 午夜影视日本亚洲欧洲精品| 日本福利一区二区| 亚洲乱码一区二区三区在线观看| 国产99久久久国产精品免费看| 日韩免费看的电影| 蜜臀av一级做a爰片久久| 欧美日韩一区二区在线观看 | 国产精品123| 欧美精品一区二区三区在线| 日本不卡的三区四区五区| 欧美精品乱码久久久久久按摩 | 日本成人超碰在线观看| 在线成人午夜影院| 午夜精品久久久久久久| 欧美三级在线播放| 午夜精品福利一区二区蜜股av| 色狠狠一区二区| 亚洲国产综合在线| 91麻豆精品国产| 蜜桃在线一区二区三区| 精品国免费一区二区三区| 久久精品国产一区二区| 欧美xxxxx裸体时装秀| 精品午夜久久福利影院 | 国产盗摄视频一区二区三区| 久久免费视频色| 粉嫩绯色av一区二区在线观看| 国产无遮挡一区二区三区毛片日本| 国产精品18久久久| 最新日韩av在线| 91国偷自产一区二区开放时间 | 欧美日韩美少妇| 午夜精品福利一区二区三区蜜桃| 欧美精选一区二区| 免费黄网站欧美| 欧美精品一区二区三区蜜桃| 国产精品亚洲成人| 综合久久久久综合| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 午夜影院久久久| 日韩精品在线看片z| 国产最新精品精品你懂的| 久久九九久精品国产免费直播| 国产高清无密码一区二区三区| 国产女主播在线一区二区| 91在线视频官网| 日日夜夜免费精品视频| 久久久精品tv| 91久久精品日日躁夜夜躁欧美| 日本不卡视频在线观看| 国产欧美一区二区精品久导航 | 日韩女优av电影| 床上的激情91.| 亚洲综合色区另类av| 精品国产一区二区国模嫣然| 成人免费看片app下载| 亚洲午夜激情av| 久久久久久久久97黄色工厂| 99视频精品在线| 日本午夜一区二区| 国产精品久久久久久妇女6080| 欧美日韩一区二区在线视频| 国产成人av电影在线观看| 亚洲一区二区av电影| 日韩美女天天操| 日本道免费精品一区二区三区| 久久99精品一区二区三区三区| 国产精品久久久久久久久免费樱桃 | 555www色欧美视频| av在线综合网| 久久精品国产**网站演员| 国产精品国产自产拍高清av | 欧美激情一区二区在线| 欧美精品vⅰdeose4hd| jlzzjlzz欧美大全| 蜜臀av性久久久久蜜臀aⅴ| 亚洲视频在线一区二区| 日韩欧美高清dvd碟片| 日本伦理一区二区| 国产福利一区在线观看| 日韩激情在线观看| 亚洲色图丝袜美腿| 久久精品在线免费观看| 欧美电影一区二区| 在线观看国产日韩| 成人av午夜影院| 另类专区欧美蜜桃臀第一页| 一区二区三区不卡视频| 2014亚洲片线观看视频免费| 欧美日韩精品免费| 色久优优欧美色久优优| 本田岬高潮一区二区三区| 久久爱另类一区二区小说| 亚洲成人动漫在线观看| 日韩一区在线看| 久久久久国产精品免费免费搜索| 日韩一级片网址| 欧美日韩一区二区三区视频| av电影天堂一区二区在线| 国产精品一线二线三线精华| 全国精品久久少妇| 亚洲综合一区二区三区| 亚洲欧洲av另类| 国产精品美女久久久久高潮| 久久久久久久综合狠狠综合| 日韩欧美第一区| 91精品国产综合久久精品性色| 91久久精品一区二区三| 色菇凉天天综合网| 色婷婷综合久久久久中文| 99久久精品国产观看| 成人av网站免费观看|