Tin công nghệ >> Cơ sở dữ liệu >> CSDL Oracle >>

ORACLE BLOCK, ROW MIGRATION, ROW CHAINING


Oracle block
Bất kỳ hệ điều hành nào cũng xác định riêng cho mình 1 block, gọi là OS block. OS block size là đơn vị nhỏ nhất cho việc read/write, và nó cũng là thuộc tính của file system. Khi tạo ra 1 Oracle Database, chúng ta sẽ xác định 1 Oracle block, size của Oracle block là 1 bội số của OS block size. Trước 9i, 1 khi đã xác định size của Oracle block, thì không thể thay đổi size này, và nó cũng tồn tại theo chu kỳ sống của Oracle Database. Để xác định 1 block size tương thích cho Database, ta phải xác định, nghiên cứu rất nhiều yếu tố trước khi đưa ra quyết định.

Header: Chứa các thông tin về data, ví dụ như block address, loại segment (table, index…), đồng thời nó cũng chứa thông tin về table, row thực sự (address) chứa data

Freespace: Không gian cấp phát cho việc insert/update trong tương lai, ảnh hưởng bởi giá trị của 2 tham số là PCTUSED và PCTFREE

Data: Row chứa dữ liệu
FreeList, PCTUSED, PCTFREE parameters:
Khi create/alter bất kỳ table/index nào, Oracle sẽ sử dụng 2 tham số đề điều khiển không gian
– PCTFREE: Số % dành riêng cho việc update các dữ liệu đã có trong tương lai
– PCTUSED: Số % của không gian nhỏ nhất đã được sử dụng cho việc insert data mới, giá trị này xác định khi nào thì các blocks sẽ được đưa trở lại vào trong FREELIST
– FREELIST: Cờu trúc xác định mà Oracle sử dụng để maitains 1 danh sách các block free hiện có.

Đầu tiên, Oracle sẽ tìm kiếm 1 free block trong FREELIST, sau đó, data sẽ được insert vào block đó, tính khả dụng của block trong FREELIST sẽ được xác định bởi giá trị của tham số PCTFREE, 1 block trống ban đầu sẽ được listed trong cấu trúc FREELIST, sau đó, nó vẫn sẽ còn ở đó cho đến khi không gian còn trống đạt đến ngưỡng của giá trị PCTFREE. Khi không gian trống đã đạt đến ngưỡng được xác định bởi giá trị của tham số PCTFREE, block sẽ được remove khỏi FREELIST, và nó sẽ được re-listed lại trong FREELIST khi và chỉ khi khối lượng data xuống dưới giá trị đã xác định của PCTUSED. Oracle sử dụng FREELIST để tăng hiệu năng hoạt động, với tất cả những câu lệnh Insert, thay vì tìm kiếm tất cả các block, Oracle sẽ chỉ tìm kiếm các free block trong FREELIST

 

 

Tham số PCTFREE xác định số % nhỏ nhất (không gian) của 1 data block được dành riêng cho việc update những row đã có trong block đó. Ví dụ: Nừu ta xác định 20% là giá trị của PCTFREE trong câu lệnh CREATE TABLE, thì có nghĩa, 20% của từng data block trong table segment sẽ được dành riêng cho việc update các row đã có bên trong từng block. Những row mới sẽ được thêm vào vùng row data, các thông tin tương ứng của chúng cũng được add vào row-overhead.

PCTUSED

Tham số PCTUSED số % nhỏ nhất của 1 block có thể được sử dụng, cộng với phần overhead của các new row khi thêm vào block. Sau khi 1 data block đã đầy đến ngưỡng của PCTFREE, Oracle sẽ tìm kiếm các block hiện hữu chưa được sử dụng để insert row mới (xem phần FREELIST). Giả sử, ta xác định giá trị của tham số PCTUSED là 40% trong câu lệnh CREATE TABLE, thì trong trường hợp này, 1 data block được xác định là chưa khả dụng nếu như tổng không gian trong block này chưa giảm xuống 39% hoặc thấp hơn (giả sử rằng không gian trong block này trước đó đã đạt tới ngưỡng của PCTFREE).

PCTFREE và PCTUSED được sử dụng cùng nhau như thế nào?

2 tham số này được sử dụng cùng nhau để tối ưu hóa việc sử dụng không gian trong data block.
Trong 1 data block mới được cấp phát, thì không gian khả dụng cho việc insert chính là block size trừ đi phần block overhead và PCTFREE. Việc update có thể sử dụng bất kỳ không gian còn trống khả dụng nào trong block. Với mỗi một data và index segment, Oracle maitain một hoặc nhiều free list (xem ở trên), là danh sách các data block đã được cấp phát và có không gian lớn hơn tham số xác định của PCTFREE. Khi ta đưa ra 1 câu lệnh Insert, Oracle sẽ kiểm tra trong FREELIST để xác định block đầu tiên nào khả dụng cho việc insert này (tính khả dụng của data block trong FreeList đã nói ở trên).

Row Migration:
Trường hợp này, 1 row đã được lưu vào trong 1 data block, tuy nhiên, khi insert tiếp, free space đã đầy, và vì thế, Oracle sẽ migrate (dịch chuyển) data của toàn bộ row này sang 1 data block mới, với data block cũ, Oracle sẽ giữ lại 1 row piece – cũng chính là rowID để trỏ tới block mới.

Hinh 1.4
Image
Đối với trường hợp Row Migration, việc Full Table Scan không bị ảnh hưởng (I/O increase), là bởi vì Forward address sẽ bị bỏ qua, tuy nhiên, Row Migration lại làm ảnh hưởng đến việc đọc Index. Bởi vì, Index sẽ nói rằng : “Đến file X, block Y, slot Z…để tìm row này”, và vì thế, khi nhận được thông điệp trên, ta lại mất thêm 1 I/O physical hoặc logical để tìm row này. (Physical I/O, Logical I/O đề cập ở phần khác).

Row Chaining:
Trong nhiều trường hợp, data cho 1 row quá lớn để lưu trong 1 single data block, do vậy, Oracle sẽ lưu data của row này vào trong 1 hoặc nhiều chained data block (các data block móc nối). Lờy ví dụ, nếu ta sử dụng 1 data block size 4KB cho Database, và cần insert 1 row với size 8KB, Oracle sẽ sử dụng 3 blocks để lưu lại data trong row. Row chaining xảy ra với các trường hợp
– Rowsize vượt quá data block size
– Table có LONG và LONGRAW columns
– Table có trên 255 column

Với trường hợp này, sẽ không có Forward Address trên 1 data block, mà ta sẽ có data trên ít nhất 2 block. Chained row có ảnh hưởng (tác động) rất khác nhau. Lờy ví dụ, chúng có có 1 row với 2 column trên 2 block. Query:

CODE: SELECT ALL
SQL> select column1 from tableA

Với column1 trên block1, sẽ không có “table fetch continued row”, tuy nhiên, nếu cũng với query:

CODE: SELECT ALL
SQL> select column2 from tableA

Thì ta sẽ nhận được kết quả với giá trị trả về trong “table fetch continued row” bởi vì block2 chính là chained row.

Xét ví dụ với cả 2 trường hợp Row Migration và Row Chaining:

CODE: SELECT ALL
SQL> show parameter db_block_size
SQL> show parameter db_block_size
NAME                                 TYPE        VALUE
———————————— ———– ——-
db_block_size                        integer     4096
SQL>
SQL> CREATE TABLE row_mig_chain_demo (
2    x int PRIMARY KEY,
3    a CHAR(1000),
4    b CHAR(1000),
5    c CHAR(1000),
6    d CHAR(1000),
7    e CHAR(1000)
Mọi thông tin chi tiết xin vui lòng liên hệ:
 
Công ty Cổ phần Công nghệ thông tin và Truyền thông Trường Giang (TGI)
Địa chỉ: Số 9 ngách 37/27 Dịch vọng, Cầu Giấy, Hà Nội
[M]: 094 900 1900 - [W]: www.pcc.com.vn - [E]: ceo@pcc.com.vn