SQLITE Architecture
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.


Contents

1 The Architecture Of SQLite
1.1 Introduction
1.2 Interface
1.3 Tokenizer
1.4 Parser
1.5 Code Generator
1.6 Virtual Machine
1.7 B-tree Driver
1.8 Page Cache
1.9 OS Interface
2 °á·Ð
3 °ü·Ã ¸µÅ©


1 The Architecture Of SQLite


ÀÛ¼ºÀÚ: mwyun(¸Û)

1.1 Introduction

SQLite libraryÀÇ acrchitecture ¼³¸í¿¡ ´ëÇÑ ¹®¼­ÀÌ´Ù. 
 
Block Diagram Of SQLite ±×¸² ÂüÁ¶ 
 

http://www.joinc.co.kr/albums/album01/agp.gif

1.2 Interface


SQLite library´Â main.c ¼Ò½º ÆÄÀϾÈÀÇ ³× °³ÀÇ ÇÔ¼öµé¿¡ ÀÇÇØ ±¸ÇöµÇ¾ú°í, °øµ¿ ÀÎÅÍÆäÀ̽ºÀÇ ´ëºÎºÐ(ÀüºÎ)ÀÌ´Ù. 
sqlite_get_table() ·çƾÀº table.c¿¡¼­ ±¸ÇöµÇ¾ú´Ù. 
Tcl interface´Â tclsqlite.c¿¡¼­ ±¸ÇöµÇ¾ú´Ù. 
ÃÖ½ÅÀÇ Á¤º¸´Â SQLite´Â °³º°ÀûÀ¸·Î »ç¿ëÇÒ ±â À§ÇÑ C interfaceÀÇ ÃֽŠÁ¤º¸°¡ ÀÖ´Ù.  
 
SQLite library¾ÈÀÇ ¸ðµç ¿ÜºÎ ½Éº¼µéÀº prefix sqlite¿Í ÇÔ²² ½ÃÀÛÇÔÀ¸·Î½á ´Ù¸¥ ¼ÒÇÁÆ®¿þ¾î¿Í À̸§ Ãæµ¹À» ÇÇÇÑ´Ù. 
±× ½Éº¼µéÀº sqlite_°ú ÇÔ²² ½ÃÀÛÇÏ´Â ¿ÜºÎ »ç¿ë¿¡ À§Çؼ­ °èȹµÈ °ÍÀÌ´Ù.(´Ù¸¥ ¸»·Î, ±× ½Éº¼Àº SQLite¸¦ À§ÇÑ APIÀÌ´Ù.??)   
 

1.3 Tokenizer


SQL ¹®ÀåÀ» ½ÇÇàÇÒ ¶§ Æ÷ÇÔÇÒ ½ÃÀÛÀ» ¾ðÁ¦ÇÒ °ÍÀΰ¡´Â inferface¿¡¼­ Åë°úµÇ¸é tokenizer¿¡¼­ ½ÃÀÛÇÑ´Ù.   
tokenizerÀÇ ÀÛ¾÷Àº ½ÃÀÛÇÏ´Â ÅäÅ«ÀÎ °æ¿ì ¸ØÃß°í(??), ±× ÅäÅ«µéÀ» parser·Î Çϳª¿¡ Çϳª¾¿(one by one) passÇÑ´Ù. 
tokenizer´Â C·Î ÀÛµ¿ÇÏ´Â ÄÚµåÀÌ´Ù. tokenizerÀ» À§ÇÑ ÄÚµåÀÇ ¸ðµÎ´Â tokenize.c ¼Ò½º ÆÄÀϾȿ¡ Æ÷ÇԵǾî ÀÖ´Ù. 
  
ÀÌ µðÀÚÀο¡¼­ ¸»ÇϰíÀÚ ÇÏ´Â °ÍÀº(¾Ë¸®´Â °ÍÀº), tokenizer°¡ parser¸¦ È£ÃâÇÑ´Ù.  
»ç¶÷µéÀº ¾î¶² ´Ù¸¥ °ÍÀ¸·Î ÇÏ´Â °Íº¸´Ù ¾Æ¸¶µµ YACC¿Í BISONÀ» Àͼ÷ÇÏ´Ù. tokenizer°¡ parser¸¦ È£ÃâÇÑ´Ù.  
ÀÛ°¡´Â SQLite¸¦ µ¿½Ã¿¡ µÎ°¡Áö ±æÀ» ³¡³ÂÀ¸¸ç parser¸¦ È£ÃâÇÏ´Â tokenizer¸¦ À§ÇÑ Åë»óÀûÀÎ ÀÛ¾÷ °á°ú nicer(??)¸¦ ã¾Ò´Ù. 
YACC´Â µÇµ¹¾Æ°¬´Ù.? 
 

1.4 Parser


parser´Â Á¶°¢ÀÌ´Ù. ±×°ÍÀÇ contextÀ§¿¡ tokensÀ» ±âº»À¸·Î Àǹ̸¦ ÇÒ´ç(ºÎ¿©)ÇÑ´Ù. 
SQLite¸¦ À§ÇÑ parsr´Â Lemon LALR parser generator(»ý¼º±â)¸¦ »ç¿ëÇÏ¿© »ý¼ºµÅ¾ú´Ù. 
 
LenmonÀº YACC/BISONÀÇ µ¿ÀÏÇÑ ÀÛ¾÷À̾ú´Ù. ±×·¯³ª À̰ÍÀ» »ç¿ëÇϴµ¥´Â ÀÔ·Â syntax(±¸¹®)ÀÌ ¿¡·¯°¡ ¹ß»ýÇϱ⠽±Áö ¾ÊÀºµ¥ Â÷À̰¡ ÀÖ´Ù.(´Ù¸£´Ù)  
Lemon ¶ÇÇÑ parser°¡ ÀçÁøÀÔ°ú thread-safeÇϵµ·Ï »ý¼ºµÇ¾ú´Ù. 
±×¸®°í lemonÀº non-terminal ¼Ò¸êÀÚÀÇ °³³äÀ» Á¤ÀÇÇÏ¿´´Ù. 
±×°ÍÀº syntxt(±¸¹®) ¿¡·¯¸¦ ¸¸³ªµµ¶óµµ ¸Þ¸ð¸® À¯ÃâÀ» ÇÏÁö ¾Ê´Â´Ù.  
¼Ò½º ÆÄÀÏ parser.y¿¡¼­ LemonÀ» ¿î¿µÇÑ´Ù.  
 
±×·¯³ª lemonÀº ÀϹÝÀûÀ¸·Î °³¹ß ¸ÞÄ«´ÏÁòÀ» ±â¹ÝÀ¸·Î ÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù.(??) lemonÀº ¿ÏÀüÇÑ ¼Ò½º ÄÚµå(´ÜÁö ÇϳªÀÇ C ¼Ò½º)À̸ç SQLite ¹èÆ÷¿¡¼­ "tool" ÇÏÀ§µð·ºÅ丮 ¾È¿¡ Æ÷ÇԵǾú´Ù.  
lemondÀÇ ¹®¼­È­´Â ¹èÆ÷ÀÇ "doc" ÇÏÀ§ µðÅ帮¿¡ ¾È¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. 
 


1.5 Code Generator


ÆÄ¼­°¡ ¿ÏÀüÇÑ SQL ¹®ÀåÀ¸·Î ÅäÅ«À» ¾î¼Àºí¸µÇÑ ÈÄ¿¡, SQL ¹®ÀåÀ» ÇÊ¿ä·Î ÇÏ´Â ÀÛ¾÷À» virtual machine¿¡¼­ »ý¼ºÇϱâ À§ÇØ ÄÚµå »ý¼º±â¸¦ ÄÝÇÑ´Ù. 
±×°ÍµéÀº ÄÚµå »ý¼º±â¾ÈÀÇ 7°³ÀÇ ÆÄÀÏÀÌ ÀÖ´Ù. 
ÀÌ ÆÄÀϵéÀº ½Ã¸®Áî ¸ÅÁ÷ ¹ß»ýÀÇ ´ëºÎºÐÀÌ´Ù. 
expr.c´Â Ç¥Çö(¼ö½Ä)À» À§ÇØ ÄÚµå »ý¼ºÀ» Á¶ÀÛÇÑ´Ù. 
where.c´Â SELECT, UPDATE¿Í DELETE ¹®ÀåÀÇ WHERE ÀýÀ» À§ÇÑ ÄÚµå »ý¼ºÀ» Á¶ÀÛÇÑ´Ù. 
delete.c, insert.c, select.c, ±×¸®°í update.c´Â SQL ¹®Àå°ú µ¿ÀÏÇÑ(same?) names¸¦ À§ÇÑ ÄÚµå »ý¼ºÀ» Á¶ÀÛ(Á¶Á¤)ÇÑ´Ù. 
ÇÊ¿äÇÑ expr.c¿Í where.c¾ÈÀÇ °¢ÀÚ È£Ãâ ·çÆ¾ÀÇ ÆÄÀÏ(?), ¸ðµç ´Ù¸¥ SQL¹®ÀåÀº build.cÀÇ Ãâ·Â ÄÚµå´Ù. 
 

1.6 Virtual Machine


ÄÚµå »ý¼º±â¿¡ ÀÇÇØ »ý¼ºµÈ ÇÁ·Î±×·¥Àº vm¿¡ ÀÇÇØ ½ÇÇàµÈ´Ù. 
vm¿¡ ´ëÇÑ Ãß°¡ÀûÀÎ Á¤º¸´Â °³º°ÀûÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. 
¿ä¾àÇϸé vmÀº database ÆÄÀÏÀ» Á¶ÀÛÇÏ´Â Ãß»ó ÄÄÇ»ÆÃ ¿£Áø ¸íÈ®ÇÏ°Ô µðÀÚÀÎµÇ¾î ±¸ÇöÇÏ¿´´Ù. 
¸Ó½ÅÀº Áß°£¹° ½ºÅ丮ÁöÀ» À§ÇØ »ç¿ëÇϱâ À§ÇØ ½ºÅÃÀ» °¡Áö°í ÀÖ´Ù. 
Each instruction contains an opcode and up to three additional operands. 
 
vmÀº ÇϳªÀÇ ¼Ò½º ÆÄÀÏ vdbe.c¾È¿¡ ¿ÏÀüÈ÷ Æ÷ÇԵǾú´Ù.  
vmÀº ´ÜÁö vdbe.h¸¦ °¡Áö°í Àִµ¥ »çÀÌ¿¡ vm°ú SQLite ¶óÀ̺귯¸®ÀÇ ¼ö¸é(?) »çÀÌÀÇ ÀÎÅÍÆäÀ̽º·Î Á¤ÀǵǾú´Ù. 
 

1.7 B-tree Driver


SQLite database´Â btree.c ¼Ò½º ÆÄÀϾȿ¡ B-Tree ±¸ÇöÀ¸·Î ÀÎÇÑ »ç¿ëÀ¸·Î µð½ºÅ©À§¿¡¼­ °ü¸®ÇÑ´Ù. 
B-tree´Â database¾ÈÀÇ °¢°¢ÀÇ table°ú index¸¦ À§ÇØ »ç¿ëµÇ±â À§ÇØ ºÐ¸®ÇÏ´Ù. 
¸ðµç B-tree´Â µ¿ÀÏÇÑ µð½ºÅ© ÆÄÀϾȿ¡ ÀúÀåµÈ´Ù. 
B-tree´Â 1024 ¹ÙÀÌÆ® Å©±âÀÇ °¢°¢ÀÇ ÆäÀÌÁöÀÌ´Ù. 
key¿Í data´Â "payload"¸¦ È£ÃâÇÏ´Â ¿µ¿ª¾È¿¡ ÇÔ²¾ ÀúÀåµÇ´Â entry(±âÀÔ, ÀÔÀå)ÀÌ´Ù. 
payload´Â B-tree entry¿¡ ÀÇÇØ µ¿ÀÏÇÑ ÆäÀÌÁö À§¿¡ ÀúÀåµÉ ¼ö ÀÖÀ¸¸ç 236 ¹ÙÀÌÆ®ÀÌ´Ù.(?) 
¾î¶² Ãß°¡ÀûÀÎ payload´Â overflow pageµé¿¡ ¿¬°á°í¸®¾È¿¡ ÀúÀåµÈ´Ù. 
 
btree.h Çì´õ ÆÄÀÏ¿¡ ÀÇÇØ Á¤ÀÇµÈ B-tree ¼­ºê½Ã½ºÅÛÀ¸·Î ÀÎÅÍÆäÀ̽ºÇÑ´Ù. 
 

1.8 Page Cache


B-tree ¸ðµâÀº 1024 byte chunks(µ¢¾î¸®)ÀÇ µð½ºÅ©¿¡¼­ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÑ´Ù. 
page cache´Â ÀÌ chunks¸¦ Àбâ, ¾²±â, ij½³Çϱâ À§ÇØ ÀÀ´ä°¡´ÉÇØ¾ß ÇÑ´Ù.  
page cache´Â ´ÜÁö database ÆÄÀÏÀÇ rollback°ú atomic commit Ãß»óÈ­¿Í reader/writer ¶ôÀ» µµ¿ÍÁÖ°í Á¦°øÇØÁØ´Ù. 
B-tree µå¶óÀ̹ö´Â page cache¿Í ¾Ë·ÁÁø page cacheÀÇ Æ¯º°ÇÑ ÆäÀÌÁö¸¦ ¿äûÇÑ´Ù. ¾ðÁ¦ ¼öÁ¤µÈ ÆäÀÌÁö ¶Ç´Â commit ¶Ç´Â rollbackÀÌ ¹Ù²¼À» ¶§, ±×¸®°í  ÆäÀÌÁö ij½¬´Â ºü¸£°í ¾ÈÁ¤Çϰí À¯È¿ÇÏ°Ô Á¶ÀÛÀ» ÇÊ¿ä·Î ÇÑ´Ù ÀÛ¾÷ÀÇ ¸ðµÎ ÀÚ¼¼È÷ »ê¶õÇÏ°Ô Á¶ÀÛÇÑ´Ù.(?)  
 
C ¼Ò½º ÆÄÀÏ pager.c¾È¿¡ page cacheÀÇ ÄÚµåµéÀÌ Æ÷ÇԵǾú´Ù. 
header file pager.h¿¡ ÀÇÇØ Á¤ÀÇµÈ page cache ¼­ºê½Ã½ºÅÛÀ¸·Î ÀÎÅÍÆäÀ̽º ÇÑ´Ù. 
 

1.9 OS Interface


POSIX¿Í Win32 os »çÀÌ¿¡¼­ ȣȯ¼ºÀÖ°Ô Á¦°øÇϸç, SQLite´Â osÀÇ ÀÎÅÍÆäÀ̽º·Î Ãß»ó °èÃþÀ» »ç¿ëÇÑ´Ù. 
os.c ÆÄÀÏÀº ÆÄÀϵéÀ» ¿­°í, ´Ý°í Áö¿ì°í, ¶ôÀ» »ý¼ºÇϰí Áö¿ì´Â, disk cache¸¦ flushingÇϰí,  ¾ÕÀ¸·Î Áö¿øÇÒ °ÍµéÀÇ 20°³ÀÇ ·çƾ¿¡ ´ëÇØ Æ÷ÇÔÇÑ´Ù.(°¡Áö°í ÀÖ´Ù.)  
ÀÌ Æò¼ÇµéÀº #ifdefs·Î ºÐ¸®µÈ µÎ°³ÀÇ ±¸ÇöÀ» Æ÷ÇÔÇÑ´Ù: POSIX¸¦ À§ÇÑ Çϳª¿Í Win32¸¦ À§ÇÑ ´Ù¸¥ °ÍÀÌ´Ù. 
os.h Çì´õ ÆÄÀÏÀÇ ÀÇÇØ Á¤ÀÇµÈ OS Ãß»ó ·¹À̾î·Î ÀÎÅÍÆäÀ̽º(Á¶Á¤ÇÑ´Ù, Á¢ÃË)ÇÑ´Ù. 
 

2 °á·Ð

SQLiteÀÇ ¾ÆÅ°ÅØÃ³¿¡ ´ëÇØ ¾Ë¾Æº¸¾ÒÀ¸¸ç, SQLite DBMS °³¹ß¿¡ ÁÁÀº Âü°í ÀÚ·á°¡ µÆÀ¸¸é ÇÕ´Ï´Ù.

¿À¿ªÀÌ ÀÖÀ»¼ö ÀÖÀ¸¹Ç·Î ¹ÌÈíÇÑ ºÎºÐÀº ¿ø¹®°ú ºñ±³Çغ¸¼¼¿ä!

3 °ü·Ã ¸µÅ©

Cache Error
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.