State Pattern

The State Pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class.




ดูแค่ structure จะเห็นว่า state pattern คล้ายกับ strategy pattern มากเลย เรียกว่าเหมือนกะเป๊งเลยดีกว่า แต่ว่า จุดประสงค์ของ 2 pattern ไม่เหมือนกัน state pattern จะเน้นที่ context object หรือ ตัว object หลักของแต่ละ state มีการเปลี่ยนพฤติกรรม ได้ โดยที่ context ไม่รู้ คือตัว state จะเปลี่ยนไปตามแต่ method ที่ถูกเรียก ในขณะีที่ strategy จะถูกโปรแกรมกำหนดให้

Unix, Linux: vmstat command

vmstat เป็นคำสั่งที่ไว้แสดงรายงาน CPU activity, memory, paging รวมๆ ก็คือไว้สำหรับดู performance ของระบบนะเอง

parameter โดยทั่้วไปของ vmstat ก็ีมี
interval หมายถึงระยะเวลาห่างแต่ละที่จะให้แสดงผล
count หมายถึงให้แสดงทั้งหมดกี่ครั้ง

ถ้าเราใช้คำสั่ง vmstat เฉยๆ โดยไม่มี parameter ต่อท้ายเลย จะหมายถึงแสดงค่าเฉลี่ยของทั้งหมดตั้งแต่เครื่องทำงานมา

$ vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 0 79744 255584 861836 0 0 0 2 1 1 1 1 98 0

ถ้าเราใส่ parameter ตัวเดียวหมายถึง จะหมายถึง interval คือ vmstat จะแสดงผลไปเรื่อยๆ (สามารถ ctrl+c ออกมา) โดยบรรทัดแรกยังแสดงค่าเฉลี่ยของระบบ ส่วนข้อมูลบรรทัดถัดไปจะเป็นข้อมูลของระบบ ณ ขณะนั้น ซึ่งจะห่างกันเท่ากับ interval เช่นตัวอย่างด้านล่าง แ่ต่ละครั้งจะแสดงห่างกัน 2 วินาที

$ vmstat 2

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 78876 255584 861844 0 0 0 2 1 1 1 1 98 0
0 0 0 79068 255584 861848 0 0 0 0 63 297 0 0 100 0
0 0 0 79116 255584 861848 0 0 0 0 27 308 0 0 100 0
0 0 0 79116 255584 861848 0 0 0 18 15 301 0 0 100 0
...

ถ้าเราใส่ parameter 2 ตัวก็หมายถึงให้แสดงผลกี่ครั้งเช่น ตัวอย่างด้านล่างให้แสดงผลทุกๆ 2 วินาที และแสดงผลแค่ 5 ครั้ง (รวมที่แสดงค่าเฉลี่ยของระบบด้วย)

$ vmstat 2 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 79412 255584 861852 0 0 0 2 1 1 1 1 98 0
0 0 0 79480 255584 861852 0 0 0 10 6 275 0 0 100 0
0 0 0 79480 255584 861852 0 0 0 0 3 272 0 0 100 0
0 0 0 79480 255584 861852 0 0 0 0 3 276 0 0 100 0
0 0 0 79480 255584 861856 0 0 0 0 143 389 3 1 96 0

การอ่านผล

kthr - kernel thread
r - runnable thread คือจำนวนเฉลี่ยของ thread ที่สามารถทำงานได้ ถ้ามีมากกว่าจำนวน CPU ก็แปลว่า thread ที่เหลืออยู่ในสถานะ waiting กำลังรอ CPU ว่าง ซึ่งถ้าจำนวน thread ที่ waiting ว่างๆ มีจำนวนมาก ก็แสดงว่า performance ต่ำ (ก็แปลว่า user อาจจะกำลังรอผลการทำงานของ CPU อยู่ก็ได้)
b - blocked thread คือ thread ที่กำลังรออะไรสักอย่าง อาจจะเป็น filesystem, I/O, memory load ถ้าเยอะๆ ก็แสดงว่า performance ม่ะดี
p - thread ที่รอ I/O แต่ไม่รวมถึง filesystem เช่นเดียวกัน ยิ่งมากยิ่งไม่ดี

cpu - CPU time

us - user mode เปอร์เซนเวลาที่ CPU ใช้ในการทำงานใน user mode ซึ่งเป็นเวลาที่ CPU ทำงานกะ application ที่ไม่ต้องการ kernel resource ในการคำนวณ จัดการ memory หรือการเก็บค่าตัวแปร
sy - system (kernel) mode เปอร์เซนเวลาที่ CPU ใช้ในการทำงานกับ kernel resource เช่นการเรียก system ให้ทำงานอ่านหรือเขียนไฟล์
id - idle คือเปอร์เซนเวลาที่ CPU ไม่มีอะไร และไม่มี pending local disk I/O
wa - คล้ายกับ id แต่ว่า รวมที่มี pending local disk I/O ด้วย


Reference:
IBM System Information Center - vmstat command

Unix, Linux: Bourne shell, C shell, Bourne shell and Bash Shell

Bourne shell เป็น default shell ของ Unix version 7 ขึ้นไป พัฒนาขึ้นในปี 1977 (ก่อนหน้านั้นเป็น Thompson shell ซึ่งเป็น shell ตัวแรก) ชื่อ Bourne ได้ชื่อตามชื่อคนสร้าง Stephen Bourne โดย AT&T Bell Lab

ส่วน C shell (csh) พัฒนามาจาก Thompson shell ที่ได้จาก Unix version 6 ก่อนที่จะเริ่มใช้ Bourne shell ซึ่ง syntax จะคล้ายกับ C แต่เดี๋ยวนี้เค้าไม่ค่อยนิยมใช้กันแล้ว เนื่องจากมีการพัฒนาเป็น Tenex C shell (tcsh) และ Korn shell ก็ได้มีการเลียนแบบ function ต่างๆ ของ C shell ไปพัฒนา

Korn shell (ksh) พัฒนาขึ้นในปี 1980 โดย David Korn จาก AT&T Bell Lab เช่นเดียวกับ Bourne จึงไม่น่าแปลกใจที่ Korn shell จะเป็น backward compatible กับ Borne shell และได้นำ function ต่างๆ ที่มีอยู่ใน C shell ใส่เข้าไปใน Korn shell ตอนแรกตัว Korn shell ยังเป็น software ที่มี license เหมือนกับ software ทั่วไปอยู่ จนกระทั่ง release 93q (ksh93) จึงได้กลายเป็น open source software เต็มตัว และตอนหลังก็ได้ มีการนำมาไว้ใน Linux ด้วย (ลองไปดูกันได้ที่ /bin/ksh) และต่อมาก็ยังมีลูกหลายอีกหลายตัวด้วยกัน เช่น pdksh, mksh, dtksh, tksh ซึ่งสองตัวหลังมีการพัฒนาเป็น GUI ด้วย

Bash shell ย่อมาจาก Bourne-Again Shell เป็น free software shell ซึ่งเกิดมาจาก GNU project สร้างขึ้นเพื่อเลียนแบบ Bourne shell บน Unix ในปี 1987 ดังนั้น Bash shell จึงเป็น default shell ของ OS ทุกตัวที่มาจาก GNU OS เช่น Linux, Mac OS X รวมถึงที่เราใช้ POSIX บน Cygwin ด้วย ข้อสังเกตุนะค่ะ คือ Bash shell เค้าไม่ได้พัฒนามาให้ใช้บน Unix ซึ่งบน Unix ตัว Bourne shell ได้พัฒนาไปเป็น Korn shell ส่วนตัว Bash shell จะใช้แค่บน Linux เป็นหลักเท่านั้น

โดยทุกคำสั่งใน Bourne สามารถใช้ได้บน Bash แต่ว่าไม่สามารถทำในทางกลับกันได้ (คือเสมือนว่า Bash พัฒนา่ต่อจาก Bourne อีกที ดังนั้นก็จะมี function เพิ่มขึ้นมาจากของเดิม) ดังนั้น shell script ของ Bourne จะสามารถใช้ได้บน Bash shell (ยกเว้นว่าใน script มีการใช้ตัวแปรพิเศษที่มีใน Bourne shell เท่านั้น) สำหรับ bash shell script จะขึ้นต้นด้วย # !/bin/sh และยังมีการนำแนวความคิดบางอย่างของ Korn shell และ C shell มาใช้ด้วย เช่น command line editing, command history (เช่นสามารถใช้คำสั่ง history เพื่อดูคำสั่งย้อนหลัง หรือใช้คำสั่ง !! เพื่อ run คำสั่งล่าสุดได้) นอกจากนั้นยังมีความสามารถในการ automatic command line completion (คือการใช้คีย์ tab เพื่อให้ shell เติมชื่อไฟล์ให้ครบถ้วน) และอื่นๆ อีก เช่นการคำนวณ integer ซึ่งเค้่าว่าใน bash shell จะไม่ต้องแตก process เพื่อใช้คำนวณ

Default prompt ของ C shell จะเป็น % ในขณะที่ Bourne shell, Korn shell, Bash shell เป็น $ (ก็ไม่น่าแปลกใจนะค่ะ เพราะว่า ตัว Korn shell กับ Bash shell ได้พัฒนาขึ้นมาจาก Bourne อีกที)

และสำหรับการ redirect standard output และ standard error ก็ต่างกันดังนี้
คำสั่งC shellBourne shell
Redirect standard output>>
Redirect standard errorไม่มีคำสั่งนี้2>
Redirect standard output and standard error>&ไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >test 2>test จะ redirect ไปที่ไฟล์ test เหมือนกัน
Redirect standard error to standard outputไม่มี แต่สามารถใช้ >& แทน เพื่อ redirect ไปที่เดียวกันได้2>&1 (ตอนใช้ต้องใช้ติดกันแบบนี้เลยค่ะ ม่ะงั้นมันจะเพี้ยน)
Redirect standard input<<
Redirect standard output; overwrite file if it exists>! หรือ > ให้ผลเหมือนกัน>
Redirect standard output and standard error; overwrite file if it exists>&! หรือ >& ให้ผลเหมือนกันเช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้
Redirect standard output to another command (pipe)||
Append standard output>>>>
Append standard output and standard error>>&เช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >>test 2>>test
Pipe standard output and standard error to another commandไม่มี2>&1|


สำหรับ Korn shell และ Bash shell น่าจะเหมือนกับ Bourne shell นะค่ะ ยังไม่มีโอกาสได้ลอง ไว้ถ้าได้ลองแล้วจะมาใส่ไว้ให้ค่ะ

Reference:
Wikipedia - Bourne shell
Wikipedia - C shell
Wikipedia - Korn shell
Unix Sys Admin
Standard Input and Output Redirection

Unix, Linux: Check CPU and Memory information

สำหรับ CPU ให้คำสั่งนี้

$ cat /proc/cpuinfo

สำหรับ memory

$ cat /proc/meminfo

ผลลัพธ์ก็ดูกันเอาเองละกันค่ะ บางอันก็ไม่ค่อยรู้ความหมายเท่าไร

JIRA: Screen Adjust

เรื่องนี้ค่อยข้างซับซ้อนนิดนึง แต่ก็ไม่ยากเกินความเข้าใจ
เริ่มต้นจาก แต่ละ issue เราสามารถกำหนดได้ว่าจะให้เป็น issue ประเภทไหน หรือว่า เป็น issue type ไำหน เมื่อกำหนดแล้ว เราก็สามารถกำหนดได้ด้วยว่า แต่ละ issue type จะให้แสดงผลอย่างไร นี่คือที่มาบอก issue type screen scheme

สมมุติเริ่มแรก เราก็จะต้อง design ก่อนว่า จะให้หน้าตา JIRA เราีมี screen อะไรบ้าน มีหน้าตาอย่างไร เราสามารถเข้าไปดูหน้าตาที่เราเคยกำหนดไว้ใน JIRA ก่อนได้ โดยจาก tool bar ด้านบน click Administrator
และ เลือกเมนู Issue Fields > Screens ทางด้านซ้าย



จะเห็นว่ามี screen เดิมอยู่บางส่วน เราสามารถ add screen ใหม่ หรือว่าเลือก config screen เดิมก็ได้ ถ้าหลังจากเรา add screen ใหม่เรา เราก็สามารถ config screen ได้ ดังรูป



เราสามารถเลือกใส่ฟิลด์ใหม่ๆ เข้ามาแสดงผลบนหน้าจอ หรือว่าจะแก้ไขลำดับการแสดงผลของแต่ละฟิลด์ก็ได้

กำหนด screen สำหรับแต่ละ operation
เมื่อเราสร้าง screen เรียบร้อยแล้ว เราก็ต้องมากำหนด screen scheme ซึ่งเป็นการกำหนดว่า operation แต่ละอย่าง เช่น create, view และ ตอน edit issue จะให้แสดงหน้าจอแแบบไหน ( โดยไปที่ Administrator เลือกเมนู Issue Fields > Screen Scheme



เช่นเดียวกัน เราสามารถสร้าง screen scheme ใหม่ หรือว่า config อันเดิมก็ได้ ถ้าเรา config อันเดิม ก็จะแสดงหน้าตาดังนี้



จะเห็นว่าด้านล่าง เราสามารถเพิ่มได้ว่า operation อะไร แสดงหน้าจออย่างไร

สำหรับ function นี้ จะไม่มีใน Enterprise Edition ค่ะ เพราะว่าใน Enterprise จะใช้ Issue Type Screen Scheme แทน ถึงกำลังจะกล่าวถึงต่อไปค่ะ

กำหนด screen สำหรับแต่ละ issue type
เช่นเดียวกับ operation เราสามารถกำหนดว่าแต่ละ issue type จะแสดงผลอย่างไรได้ ผ่านทาง issue type screen scheme โดยเลือกเมนู Issue Fields > Issue Type Screen Scheme เช่นเดิม



จากหน้านี้ถ้าเราแก้ไข config ของ screen scheme เดิม เราก็จะเห็นว่าในหน้าจอเปิดให้เราสามารถเลือกได้ว่า issue type อะไรจะแสดงผลโดยใช้ screen ไหน



ก็เอาเป็นว่าคร่าวๆ เป็นดังนี้แล ก็จะเห็นได้่ว่า JIRA ค่อนข้างจะสามารถปรับแต่งได้เยอะทีเดียว ก็คงพอเข้าใจกันมากขึ้นนะค่ะ

Oracle: USER_SEGMENTS กับการเช็ค allocated space

ได้รู้จักกับ segment ใน Oracle ไปแล้วนะค่ะ อย่างที่เคยบอกไปว่า segment จะเก็บโครงสร้างของข้อมูลที่เหมือนกัน หรือว่าก็คือ table หนึ่งๆ นั่นเอง แต่ว่าก็ไม่ใช่ว่า segment จะเก็บ table อย่างเดียว เพราะ index ก็เป็นข้อมูลอีกส่วนหนึ่งของ table ที่จะต้องเก็บด้วย แหละเนื่องจากแต่ละ index มีโครงสร้างไม่เหมือนกัน แหละก็ไม่เหมอืนกับ table ด้วย ดังนั้น index แต่ละ index ก็จะถูกเก็บใน segment ของมันเอง เราสามารถดูข้อมูลของ segment ต่างๆ ได้จาก USER_SEGMENTS ที่เป็น system view ข้อมูลที่ view นี้จะบอกก็มีดังนี้

SEGMENT_NAME - เป็นชื่อของ segment หรือชื่อของ table หรือ index ที่มันเก็บใน segment นั้น เช่นถ้าเรา create table test1 ขึ้นมา ก็จะมี segment ที่ชื่อว่า test1 โผล่มาด้วย

SEGMENT_TYPE
- ประเภทของ segment ซึ่งอาจมีค่าดัีงนี้ TABLE, INDEX segment ประเภทนี้จะเก็บข้อมูลของ table และ index ตามลำดับ แต่เก็บ table หรือ index อะไร นั้นดูได้จาก SEGMENT_NAME) นอกจากนี้ ก็ยังมีประเภท CLUSTER, ROLLBACK, DEFERRED ROLLBACK, TEMPORARY, SPACE HEADER, TYPE2 UNDO และ CACHE

SEGMENT_SUBTYPE - คอลัมน์นี้ก็จะบอก ข้อมูลอีกประเภทหนึ่งของ segment คือ ASSM (Automatic Segment Space Management) ซึ่งระบบจะเป็นตัวจัดการเรื่อง space ที่จะใช้เอง หรือ MSSM (Manual Segment Space Management) ที่ผู้ใช้สามารถระบุ pctused เองได้ นอกจากนี้ก็มีประเภทอื่นอีก แต่ไ่ม่รู้ความหมายเหมือนกันค่ะ เช่น SECUREFILE, NULL ถ้าใครรู้เขียนมาบอกด้วย ก็จะขอบคุณมาก จะได้ไว้ update เผื่อเป็นความรู้ให้คนอื่นๆ ต่อไป

TABLESPACE_NAME - อัีนนี้ก็เป็น tablespace ที่ segment นี้ถูกสร้างขึ้นมา ซึ่งอย่างที่เคยเขียนไว้ก่อนหน้านี้ว่าตอนที่เราสร้าง table เราสามารถระบุ tablespace ได้ว่าจะให้สร้างไว้ที่ tablespace ไหน ซึ่ง segment ที่เก็บข้อมูลของ table ก็จะต้องถูกสร้างไว้ที่ tablespace ที่ระบุไว้

BYTES, BLOCKS, EXTENTS - จำนวนไบต์, block, extent ที่ allocated ให้กับ segment นี้ ไม่ใช่ขนาดของข้อมูลจริงๆ นะค่ะ เหมือนขนาดที่จองไว้

ตัวอย่าง

> select segment_name, bytes, blocks, extents from user_segments where segment_name = 'TEST'

SEGMENT_NAME BYTES BLOCKS EXTENTS
------------------- --------- --------- ----------
TEST 65536 8 1

จากตัวอย่างจะเห็นได้่ว่า table test จองไว้ 8 block ซึ่งคิดเป็น 65536 byte (1 block = 8 KB)

INITIAL_EXTENT - ขนาดของ initial extent
NEXT_EXTENT - ขนาดของ extent ถัดไปที่จะถูก allocate มาให้
MIN_EXTENTS - จำนวน extent ต่ำสุดที่จะมีได้ ซึ่งปกติก็จะเป็น 1
MAX_EXTENTS - จำนวน extent สูงสุดที่จะมีได้ใน segment นั้นๆ
MAX_SIZES - จำนวน block มากที่สุดที่จะมีใน segment นั้นๆ ซึ่งแน่นอน MAX_SIZES ก็จะต้องมีค่ามากกว่าหรือเท่ากับ MAX_EXTENTS ก็คือทุก block จะต้องอยู่ใน extent

นอกจากนี้ก็ยังมีอีกหลายฟิลด์ เช่น RETENTION, MINRETENTION, PCT_INCREASE, FREELISTS, FREELIST_GROUPS, BUFFER_POOL แต่ขอไม่กล่าวถึง เพราะว่าไม่ค่อยเข้าใจมากนัก

Reference:
USER_SEGMENTS view tips

Oracle: Overview for Architecture

อย่างที่ทุกคนรู้โดยทั่วๆ ไปนะคะ่ database ก็จะต้องมี table อาจจะมี view, store procedure หรือ ฯลฯ แต่ลักษณะการเก็บข้อมูลของ table หรือ schema object พวกนี้ทำยังไง

ในทาง physical Oracle เก็บข้อมูลใน database เป็นไฟล์บนฮาร์ดดิสต์ เหมือนข้อมูลของโปรแกรมอื่นๆ (แน่นอนอ่ะนะ เพราะว่าจะเก็บลงดิสต์ ก็คงต้องเป็นไฟล์่ละนะ ยังไม่เคยเห็นวิธีอื่นนิ) หรือที่ Oracle เรียกว่า data files

แต่สำหรับในทาง logical ข้อมูลพวกนี้จะถูกเก็บอยู่ใน data blocks ซึ่งอยู่ใน extents ซึ่งอยู่ใน segments ซึ่งอยู่ใน tablespaces หลายชั้นเหลือเกิน ดูรูปดีกว่า


data blocks หรือจะเรียกว่า logical blocks, Oracle blocks หรือ pages นั่นเอง เป็นหน่วยเล็กที่สุดในการเก็บข้อมูล ซึ่ง 1 blocks โดย default คือ 2 KB (ของ Sybase 1 page = 2 KB)

extents
จะเป็นชุดของ data blocks ที่อยู่ติดกันในเนื้อที่บนฮาร์ดดิสต์

segments
ก็จะเป็นชุดของ extents อีกที แต่เป็น extents ที่เก็บชุดของข้อมูลประเภทเดียวกัน ที่บอกว่าเป็นข้อมูลประเภทเดียวกัน ก็คือข้อมูลที่มีโครงสร้างเหมือนกัน หรือก็คือ table นั่นเอง ดังนั้นใน extents ใดๆ ใน segment หนึ่ง ก็จะเก็บข้อมูลของ table A เหมือนกัน หรือ table B เหมือนกัน แบบนี้เป็นต้น สำหรับ non-cluster table จะถูกเก็บอยู่ใน 1 segment ซึ่ง segment นี้จะถูกสร้างขึ้นมาพร้อมกับคำสั่ง create table/snapshot
ใน 1 segments จะต้องมีอย่างน้อย 1 extent เรียกว่า initial extent ไว้สำหรับเก็บข้อมูล ซึ่งเวลาที่ segments เต็ม หรือก็คือ extents ที่อยู่ใน segment เต็มหมดแล้ว Oracle จะ allocate เนื้อที่ให้เป็น extent ใหม่ ซึ่ง extent ใหม่อาจจะเป็นเนื้อที่ที่ติดกัน หรือไม่ติดกัน บนฮาร์ทดิสต์ก็ได้ หรือขยาย extent เดิมที่มีอยู่แล้วก็ได้

tablespaces
เป็นหน่วยใหญ่สุดของ logical storage unit ซึ่งใน 1 tablespace ก็จะมีหลายๆ segments และใน 1 tablespaces นี้อีกเหมือนกันจะประกอบไปด้วย data files ซึ่งอาจจะมี 1 data files หรือมากกว่านั้นก็ได้

Oracle จะใช้ tablespace เนี้ยะแหละในการควบคุมโควต้าการใช้เนื้อที่ของ user และการใช้เนื้อที่ในดิสต์ของ database เช่นในตอนที่ create user ได้ว่าจะใช้ user คนนี้ใ้ช้ tablespace อะไรที่โควต้าเท่าไร เช่น ตัวอย่างนะค่ะ

CREATE USER &username
IDENTIFIED BY &password
DEFAULT TABLESPACE &user_tablespace
QUOTA 100M on &user_tablespace
TEMPORARY TABLESPACE TEMP
QUOTA 5M on SYSTEM

แต่คิดว่าน่าจะมีอย่างอื่นอีก ถ้ารู้เพิ่มเติมแล้วจะมีอัพเดตให้อีกนะค่ะ

Data Block

กลับมาพูดถึง data blocks ที่เป็นหน่วยย่อยสุดกันบ้าง เพราะว่า data block ก็คือกลุ่มของ physical byte บน ดิสต์นะเอง แต่ว่าเป็นคนละตัวกับ I/O block ของ OS โครงสร้างของ block ก็เป็นตามรูปเลยฮับ

Header (Common and Variable) เป็นส่วนที่เก็บข้อมูลของ block นั้นๆ เช่น address, ประเภทของ segment (data, index) ขนาดของ header จะไม่คงที่

Table Directory เก็บข้อมูลของ tables ที่มีข้อมูลอยู่ใน block นั้นๆ

Row Directory เป็นส่วนที่เก็บข้อมูลของแต่ละ row ใน block นั้น และ address ที่เก็บ row นั้นๆ ด้วย

Row Data ส่วนนี้เป็นส่วนที่เก็บข้อมูลจริงๆ ของ row แล้วค่ะ ซึ่งเค้าบอกว่า ใน 1 row อาจจะใหญ่กว่า block ก็ได้ก็คือมีข้อมูลอยู่ในหลายๆ block

Free Space เหมือนชื่อเลยคะ่ เป็นที่ว่างๆ ที่ไว้สำหรับใส่ข้อมูลของ row ที่เพิ่มเข้ามา หรือว่าไว้สำหรับข้อมูลที่จะ update ใน row เดิมที่อยู่ใน block นั้นๆ อยู่แล้ว


มีตัวแปรอยู่ 2 ตัวที่ใช้ในการควบคุมการใช้พื้นที่ใน block คือ PCTFREE และ PCTUSED


PCTFREE เป็นตัวบอกเปอร์เซ็นพื้นที่ว่าง เพื่อบอกว่า block นี้เต็มหรือยัง เช่น ถ้า pctfree 20 ก็คือถ้า block นั้น มีพื้นที่ว่างน้อยกว่า 20% จะถือว่าเต็มแล้ว และจะไม่อนุญาตให้ insert ข้อมูลเพิ่มเข้ามา แต่ยังคงให้ update ข้อมูลที่อยู่ใน block ได้

PCTUSED เป็นตัวบอกเปอร์เซ็นพื้นที่ที่ใช้ไป เพื่อบอกว่า block นี้ว่างแล้ว และพร้อมที่จะรับข้อมูล insert เข้ามาใหม่ได้ เช่น ถ้า pctused 40 ก็คือถ้า block นั้นจะต้องมีพื้นที่ใช้ไป น้อยกว่า 40% จะถือว่า block นี้ว่างและพร้อมจะกลับมารับข้อมูลที่จะ insert เข้ามาใหม่ได้อีก

ตัวอย่างการใช้ pctfree, pctused บน create table script
CREATE TABLE EMP1
( EMPNO NUMBER(4,0),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4,0),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2,0)
) tablespace test PCTFREE 50 PCTUSED 30

แต่การใช้ pctused ใช้ได้เฉพาะกับ table ที่ไม่ได้สร้างใน ASSM tablespace (automatic segment space management) เท่าันั้น สำหรับ version 10 table ที่สร้างใน ass managed tablespace ค่า pctused จะเป็น null เสมอ (ในตัวอย่างก็เลยสร้าง table ใน tablespace อื่น)
และสำหรับ version 9 ลงไป มันจะไม่สนใจค่านี้เลย แต่ว่าจะใส่ค่าที่ระบบกำหนดลงไปแทน

Reference:
Oracle Architecture & Terminology
pctfree, pctused - Database Forum

Sybase: sp_spaceused <table> กับการคำนวณ row per page

คำสั่ง sp_spaceused ถ้าใช้โดยไม่ใส่ parameter ด้านหลังจะเป็นการแสดงค่าประมาณของ disk space ของทั้ง database ซึ่ง result ที่ได้มีสองส่วน คือ

> sp_spaceused

1. เนื้อที่ที่ database จองไว้ จึงเป็นค่าคงที่ ยกเว้นมีการเพิ่มเนื้อที่ให้กับ database นั้นๆ

database_name   database_size
--------------- ---------------------------
master          5 MB


2. แสดงค่าประมาณของเนื้อที่การใช้งานของ database

reserved    data        index_size  unused
---------   ---------   ----------- --------
2176 KB     1374 KB     72 KB       730 KB


ผลรวมในข้อ 2 จะประมาณใกล้เคียงกับข้อ 1 ซึ่ง แต่ทั้งนี้เพราะว่าเป็นผลแค่การประมาณเท่านั้น แต่ก็สามารถนำมาใช้ในอ้างอิงได้

สำหรับการใช้ sp_spaceused ที่ตามด้วยชื่อ table จะเป็นการดูการประมาณการใช้เนื้อที่ของ table นั้นๆ

> sp_spaceused xxx

name     rowtotal  reserved  data    index_size unused
-------- --------- --------- ------- ---------- ----------
xxx          42955 97554 KB  4340 KB 92140 KB   1074 KB


ซึ่งเราสามารถนำค่าที่ได้มาหาจำนวน row per page ได้ เช่นตัวอย่างข้างต้น
table นี้ใช้เนื้อที่เก็บ data 4340 KB / 2 KB (default 1 page = 2 KB) = 2170 pages
ดังนั้น row / page = 42955 rows / 2170 pages = 19.79
หรือใน 1 page ของ table จะมีประมาณ 19 หรือ 20 rows

หรือถ้าเราใส่ parameter ต่อท้ายเข้าไปอีก ก็จะเป็นการแสดงการประมาณการใช้เนื้อที่ของ index ของ table นั้นๆ

> sp_spaceused blurbs,1

index_name           size       reserved   unused
-------------------- ---------- ---------- ----------
blurbs               0 KB       14 KB      12 KB
tblurbs              14 KB      16 KB      2 KB


name       rowtotal reserved    data    index_size unused
---------- -------- ----------- ------- ---------- ----------
blurbs            6 30 KB       2 KB    14 KB      14 KB



Reference:
Sybase System Procedures: sp_spaceused