Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
KHOA TIN HỌC
BÁO CÁO ĐỀ TÀI
CƠ SỞ DỮ LIỆU NÂNG CAO
ĐỀ TÀI : TỐI ƯU HÓA TRUY VẤN
GVHD : TRẦN QUỐC CHIẾN
Sinh Viên : SUKHOI
Lớp Học Phần : 11 03-A
Đà Nẵng, ngày 8 tháng 5 năm 2013
1
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
MỤC LỤC
2
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
1. Giới thiệu:
1.1 Thuật toán tối ưu hóa truy vấn:
Tối ưu hóa vấn tin là quá trình sinh ra một hoạch định thực thi vấn tin
(query execution plan – QEP ) biểu thị chiến lược thực thi vấn tin, hạ thấp tối đa
hàm chi phí. Thể tối ưu hóa vấn tin, là một đơn thể phần mềm chịu trách nhiệm
thực hiện tối ưu hóa,cấu tạo bởi ba thành phần: không gian tìm kiếm (seach
space), một mô hình chi phí (cost model ) và một chiến lược tìm kiếm (search
strategy ) như hình sau
CÂU VẤN TIN
QEP TƯƠNG ĐƯƠNG
QEP TỐT NHẤT
Không gian tìm kiếm là tập các hoạch định thực thi biểu diễn cho câu vấn
tin. Những hoạch định này là tương đương, theo nghĩa chúng sinh ra cũng kết
quả nhưng khác nhau ở thứ tự thực hiện các thao tác và cách thức cài đặt những
thao tác này,vì thế khác nhau ở hiệu năng. Không gian tìm kiếm thu được bằng
cách áp dụng các qui tắc biến đổi , chẳng hạn những qui tắc cho đại số quan hệ
Mô hình chi phí tiên đoán chi phí của một hoạch định thực thi đã cho. Để
cho chính xác, mô hình chi phí phải có đủ thông tin cần thiết về môi trường thực
thi.
Chiến lược tìm kiếm sẽ khám phá không gian tìm kiếm và chọn ra hoạch
định tốt nhất dựa theo mô hình chi phí.
1.2 Nhóm:
Sukhoi (tiếng Nga: Сухой) là một công ty sản xuất máy bay quân sự lớn
của Nga. Được thành lập bởi Pavel Osipovich Sukhoi năm 1939. Hiện nay Su-
24, Su-25, Su-24M, Su-27, Su-30, Su-33 hiện đang phục vụ trong Không quân và
Hải quân Nga.
Máy bay chiến đấu Sukhoi đã được cung cấp cho Ấn Độ, Trung Quốc, Ba
Lan, Cộng hòa Séc, Slovakia, Hungary, Đức, Syria, Algérie, Triều Tiên, Việt
Nam, Afghanistan, Yemen, Ai Cập, Libya, Iran, Angola, Ethiopia và Peru.
3
TẠO RA KHÔNG GIAN
TÌM KIẾM
Qui tắc biến đổi
CHIẾN LƯỢC TÌM KIẾM
Mô hình chi phí
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
Với đặc điểm chiến đấu cơ động, tốc độ siêu thanh, thích ứng trong mọi
điều kiên thời tiết và quyết định lấy tên nhóm là Sukhoi cũng xuất phát từ đó.
Nhóm gồm 5 thành viên:Nguyễn Thị Kim Hoàng, Nguyễn Thị Diễm
Hường, Khổng Thang Dũng, Nguyễn Quang Trung và Lê Văn Trung luôn với
tinh thần không ngừng học hỏi, tự giác và chủ động học tập, nêu cao tinh thần
trách nhiệm trong làm việc nhóm, làm việc có tổ chức có phân công và đạt hiệu
quả.
Làm việc theo nhóm là một trong những kỹ năng thiết yếu cho sinh viên
trong học tập, nghiên cứu và cho công việc sau này.Cùng với sự giúp đỡ của quý
thầy cô hướng dẫn cộng với sự nỗ lực thì nhóm Sukhoi sẽ đi đến đích của thành
công.
SUKHOI:
STT Họ và tên Công việc
Chữ
kí
Nhận xét
của giáo
viên
1 Nguyễn Thị Diễm Hường Viết báo cáo, thuật
toán,chương trình, ví dụ
của việc nối 2 quan hệ
bằng phương pháp sắp nối
2 Nguyễn Thị Kim Hoàng -Viết báo cáo, thuật toán,
chương trình, ví dụ của
việc nối 2 quan hệ bằng
phương pháp chọn trên
tích.
-Đánh giá chi phí truy xuất
khối phương pháp sắp nối.
-Cấu trúc các file R, S,
RS1, RS2.
3 Khổng Thanh Dũng -Giới thiệu thuật toán tối
ưu hóa truy vấn.
-Viết chương trình sắp xếp
2 quan hệ R và S
4 Nguyễn Quang Trung -Giới thiệu nhóm
SUKHOI
5 Lê Văn Trung -Đánh giá chi phí truy xuất
khối phương pháp chọn
trên tích
4
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
2. Nội dung:
2.1Trình bày các thuật toán:
2.1.1 Thuật toán nối 2 quan hệ bằng phương pháp chọn trên tích
a. Thuật toán:
Dành (M-1) khối bộ nhớ chính để chứa các khối của S và 1 khối bộ nhớ
chính để chứa các khối của R.
Chia S thành những đoạn dài M-1 khối. Với mỗi đoạn D của S được đọc
vào bộ nhớ chính, ta nộp lần lượt từng khối K của R vào 1 khối trong bộ nhớ
chính và thực hiện:
for mỗi bộ v trong D do
for mỗi bộ u trong K do
Nếu R(B) = S(B) thì RS(A) = R(A), RS(B) = R(B), RS(C) = S(C)
In các bản ghi RS vào file RS1.DAT
b. Đánh giá chi phí truy xuất khối và độ phức tạp:
Giả thiết : R và S được xếp chặt.
R
T
và
S
T
là số bản ghi của R và S.
R
B
và
S
B
là số khối chưá R và S.
M là số khối bộ nhớ trong.
Thuật toán trên sẽ cần B lần truy suất khối để đọc quan hệ S và mỗi khối
của R sẽ được truy xuất d lần (d là số đoạn M - 1 khối cúa S). Vì d xấp xỉ bằng
1
S
B
M −
nên chi phí đọc dữ liệu là :
.
1
R S
S
B B
B
M
+
−
Gọi I là tích kích thước miền các thuộc tính chung của R và S(ở đây là chỉ
thuộc tính B chung). Vì số lượng bộ trung bình của nối R><S bằng số bộ của tích
R × S (
.
R S
T T
) chia cho I nên số khối trung bình của nối R><S cũng bằng số
khối của tích R × S chia cho I.
Chi phí ghi dữ liệu ở đây là :
. .
R S S R
B
B T B T
I
+
Vậy tổng chi phí đọc ghi là :
. . .
1
R S R S S R
S
B
B B B T B T
B
M I
+
+ +
−
5
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
c. Ví dụ: Cho R(A, B) và S(B, C)
R A A B c d e F g h
B 4 5 2 3 1 2 1 3
S B 1 2 1 2 4 3
C U V t x y Z
Giả sử khối S chứa được 2 bản ghi, bộ nhớ trong M=3. Khi đó số khối của
R và S là B
R
= 4, B
s
= 3. Ta dành M-1 = 2 khối, kí hiệu M
s
, để đọc S, 1 khối, ký
hiệu M
r
và M
s
như sau :
M
r
A
B
M
s
B
C
Thực hiện nối như sau:
Vòng 1: Đọc hai khối của S vào M
s
, ta được:
M
s
B 1 2 1 2
C U V t x
Sau đó đọc từng khối của R và M
r
, so sánh các bản ghi của M
s
với các
bản ghi của M
r
và nối những cặp khớp nhau(có thuộc tính B trùng nhau)
-Đọc khối thứ nhất của R vào M
r
ta có:
M
r
A A b
B 4 5
Các bản ghi của M
s
và M
r
không nối được với nhau. R nối tự nhiên với
S rỗng.
-Đọc khối thứ hai của R và M
r
ta có:
M
r
A C D
B 2 3
So sánh các bản ghi của M
s
với các bản ghi của M
r
, ta thấy bản ghi
(2,v) và (2,x) của M
s
nối được với bản ghi (c,2) của M
r
. ta nhân được:
M
r
A C c
B 2 2
6
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
C V x
-Đọc khối thứ ba của R vào M
r
ta có:
M
r
A E f
B 1 2
So sánh các bản ghi của M
s
với các bản ghi của M
r
ta thấy bản ghi (1,
u) và (1,t) của M
s
nối được với bản ghi (e, 1) của M
r
và bản ghi (2, v)và
(2, x) của M
s
nối được với bản ghi (f, 2) của M
r
. Ghi tiếp các nối vào R
nối tự nhiên S, ta được:
R ntn S A C c e E F f
B 2 2 1 1 2 2
C V X u T V x
-Đọc khối thứ tư của R vào M
r
ta có:
M
r
A G h
B 1 3
So sánh các bản ghi của M
s
với các bản ghi của M
r
, ta thấy bản ghi (1,
u) và (1, t) của M
s
nối được với bản ghi (g, 1) của M
r
.Ghi tiếp các nối vào R nối
tự nhiên S, ta nhân được R nối tự nhiên S có 8 bản ghi:
R ntn
S
A C C e e f F G g
B 2 2 1 1 2 2 1 1
C V X u t v X U t
Vòng 2: Đọc một khối của S vào M
s
ta được:
M
s
B 4 3
C Y Z
Sau đó đọc lần lượt từng khối của R vào M
r
, nối các bản ghi của M
s
với các bản ghi của M
r
, ghi tiếp vào R ntn S. kết thúc vòng này, R ntn S
có thêm 3 bản ghi:
A A D h
B 4 3 3
C Y Z Z
Cuối cùng ta có R ntn S như sau:
R S A C C E e f f g G A d h
B 2 2 1 1 2 2 1 1 4 3 3
C V X U t v x u T Y z z
7
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
2.1.2 Thuật toán nối 2 quan hệ bằng phương pháp sắp nối
a. Thuật toán:
Dành vùng nhớ M’ (mảng hoặc con trỏ) lưu các bảng ghi của R và S nối được
với nhau (có giá trị cùng thuộc tính B).
Trỏ con trỏ đọc vào bảng ghi đầu của R
Đọc bảng ghi u của R
Đọc bảng ghi v của S
Do
1.Nếu u(B) = v(B)
-Nếu u(B) = v(B) bằng giá trị thuộc tính B của các bảng ghi trong vùng nhớ M’:
(Ghi u vào M’)
-Ngược lại, tức u(B) = v(B) khác giá trị thuộc tính B của các bảng ghi trong vùng
nhớ M’:
(Nếu M’ không rỗng, thì kết xuất các nối trong M’ ra đĩa;
-Đọc tiếp bản ghi u € R và v € S;
2.Nếu u(B) < v(B)
-Nếu u(B) bằng giá trị thuộc tính B của các bản ghi trong vùng nhớ M’:
(Ghi u vào M’)
-Ngược lại, tức u(B) lớn hơn giá trị thuộc tính B của các bản ghi trong vùng nhớ
M’:
(Nếu M’ không rỗng, thì kết xuất các nối trong M’ ra đĩa; xóa các bản ghi trong
M’)
-Đọc tiếp bản ghi u € R;
3.Nếu u(B) > v(B)
-Nếu v(B) bằng giá trị thuộc tính B của các bản ghi trong vùng nhớ M’:
(ghi v vào M’)
-Ngược lại, tức v(B) lớn hơn giá trị thuộc tính B của các bản ghi trong vùng nhớ
M’:
(Nếu M’ không rỗng, thì kết xuất các nối trong M’ ra đĩa; Xóa các bản ghi trong
M’)
-Đọc tiếp bản ghi v € S;
While đọc hết hoặc R hoặc S
-Nếu S hoặc R còn bản ghi, thì đọc và ghi các bản ghi có giá trị thuộc tính B
bằng giá trị thuộc tính B trong M’ vào M’
-Nếu M’ không rỗng, thì kết xuất các nối trong M’ ra đĩa;
b. Đánh giá chi phí truy xuất khối và độ phức tạp:
8
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
Giả thiết : R và S được xếp chặt.
R
T
và
S
T
là số bản ghi của R và S.
R
B
và
S
B
là số khối chưá R và S.
M là số khối bộ nhớ trong.
Với phương pháp trên thì mỗi khối của R và S chỉ cần đọc một lần nên chi phí
đọc của thuật toán là :
R S
B B
+
Gọi I là tích kích thước miền các thuộc tính chung của R và S (ở đây là chỉ
thuộc tính B chung).
Vì số lượng bộ trung bình của nối R><S bằng số bộ của tích R × S (
.
R S
T T
) chia cho I nên số khối trung bình của nối R><S cũng bằng số khối của tích R ×
S chia cho I. Chi phí ghi dữ liệu ở đây là :
. .
R S S R
B
B T B T
I
+
Vậy tổng chi phí đọc ghi là :
. .
R S S R
R S
B
B T B T
B B
I
+
+ +
c. Ví dụ:
Cho R(A, B) và S(B, C) như sau :
R A A B c d
B 1 1 2 3
S B 1 2 2
C X Y z
Bộ nhớ M’ có cấu trúc như sau :
M’ A
B Null
C
9
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
Ban đầu M’ rỗng và giá trị thuộc tính B trong M’ chưa xác định,
M’.B = null. Nối R ntn S có cấu trúc như sau :
R ntn S A
B
C
Ban đầu R ntn S rỗng, chưa có bản ghi nào cả. Ta thực hiên thuật
toán 4.2 để nối R và S như sau:
-Đọc R vào u, và S vào v:
Ta có u(B) = v(B) = 1. Vì M rống nên ta đưa v và u vào M’:
M’ A A
B 1
C X
Đọc tiếp R vào u và S vào v:
R A A b c d
B 1 1 2 3
S B 1 2 2
C X y z
Ta có u(B) = 1 < v(B) = 2. Vì u(B) = 1 = M’.B, nên ta đưa u vào M’.
M’ A a b
10
R A A B c d
B 1 1 2 3
S B 1 2 2
C X Y Z
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
B 1
C x
-Đọc tiếp R vào u:
S B 1 2 2
C X y z
Ta có u(B) = v(B) = 2 > M’.B = 1. Ta nối các bản ghi trong M’, ghi
ra R ntn S, sau đó làm rỗng M’, đưa u, v vào M’
M’ A Y
B 2
C C
-Đọc tiếp R vào u và S vào v:
S B 1 2 2
C X y z
Ta có v(B) = 2 < u(B) = 2 = M’.B, nên ta đưa v vào M’:
11
R A a b c d
B 1 1 2 3
M’ A A b
B 1 1
C X x
R A A b c d
B 1 1 2 3
M’ A C
B 2
C Y Z
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
Lúc này S đã hết, R vẫn còn bản ghi.
Vì u(B) = 3 > M’.B = 2, ta nối các bản ghi trong M’, ghi ra R ntn S
RntnS A A b c C
B 1 1 2 2
C X x y Z
Kết thúc.
2.2 Phân tích thiết kế cấu trúc dữ liệu và giải thuật
2.2.1 Thuật toán nối 2 quan hệ bằng phương pháp chọn trên tích
a. Cấu trúc file R.DAT, S.DAT, RS1.DAT
- Cài đặt quan hệ R dưới dạng file có tên là R.dat :
Quan hệ R (A,B )
+R.A có kiểu int : có các số nguyên từ 0 -> 999
+R.B có kiểu int : có các số nguyên từ 0 -> 99
- Khai báo: struct R {
int A;
int B ;
};
- Cài đặt quan hệ S dưới dạng file có tên là S.dat :
Quan hệ S ( B,C )
+S.B có kiểu int : có các số nguyên từ 0 -> 999
+S.C có kiểu int : có các số nguyên từ 0 -> 99
- Khai báo :Struct S{
int C;
int B;
};
- Quan hệ RS1: là nối tự nhiên của 2 quan hệ R và S :
RS1.A có kiểu int
RS1.B có kiểu int
RS1.C có kiểu int
- Kết quả nối là file RS1.dat chứa các bản ghi kiểu RS
Vậy : đầu vào: 2 file: R.dat và S.dat
đầu ra: file RS1.dat
12
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
struct RSbanghi {
int A;
int B;
int C;
}
b.Cấu trúc bộ nhớ trong M.
M là số khối bộ nhớ trong (số lượng khối mà bộ nhớ chính chứa được tại thời
điểm bất kì).
Số bản ghi của R là Tr.
Số bản ghi của S là Ts .
Giả sử Tr > Ts : Tr = 1000, Ts = 500
bfR là số bản ghi của 1 khối R .
bfS là số bản ghi của 1 khối S .
Cho bfR = bfS = 15.
Khối bộ nhớ để đọc R có cấu trúc:
struct Rbanghi Rkhoi[bfR];
Khối bộ nhớ để đọc S có cấu trúc:
struct Sbanghi Skhoi[Mmax-1][bfS]; (Mmax là hằng chỉ số khối
bộ nhớ trong tối đa).
Khối bộ nhớ để ghi RS có cấu trúc :
struct RSbanghi RS;
c. Thiết kế giải thuật:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define mMax 20
#define bfR 15
#define bfS 15
#define bfRS 10
FILE *fr, *fs, *frs, *fRS;
char *Rname = "R.DAT";
char *Sname = "S.DAT";
13
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
char *RSname = "RS.DAT";
char *RSname1 = "RS1.TXT";
int sizeR, sizeS, sizeRS;
int pR, pS;//con tro file
int m; //bo nho
int Ts, mTs; //so ban ghi con lai cua S
int Tr, mTr; //so ban ghi con lai cua R
int Trs;
int ks; //khoi cuoi chua S
int js; //ban ghi cuoi trong khoi k cua s
int jr; //ban ghi cuoi trong khoi cua R
int jrs; //ban ghi cuoi trong khoi cua RS
int k, i, j, d = 0;
struct Rbanghi{
int A, B;
};
struct Sbanghi{
int B, C;
};
struct RSbanghi{
int A, B, C;
};
struct Rbanghi R,Rkhoi[bfR];
struct Sbanghi S,Skhoi[mMax-1][bfS];
struct RSbanghi RS;
void NoiRS()
{
for(k = 0; k < ks; k++)
for(j = 0; j <= bfS - 1; j++)
for(i = 0; i <= jr; i++)
{
14
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
if(Skhoi[k][j].B == Rkhoi[i].B)
{
RS.A = Rkhoi[i].A;
RS.B = Rkhoi[i].B;
RS.C = Skhoi[k][j].C;
fwrite(&RS, sizeof(struct RSbanghi), 1, frs);
}
}
//khoi cuoi cua S
for(j = 0; j <= js; j++)
for(i = 0; i <= jr; i++)
{
if(Skhoi[ks][j].B == Rkhoi[i].B)
{
RS.A = Rkhoi[i].A;
RS.B = Rkhoi[i].B;
RS.C = Skhoi[ks][j].C;
fwrite(&RS, sizeof(struct RSbanghi), 1, frs);
}
}
}
void ghiRS()
{
printf("\n**** Nhap so khoi bo nho trong : \a");
scanf("\n %d",&m);
sizeR = sizeof(R);
sizeS = sizeof(S);
sizeRS = sizeof(RS);
//mo file
fr = fopen(Rname,"rb");
fs = fopen(Sname,"rb");
15
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
frs = fopen(RSname,"wb");
fseek(fr,0,SEEK_END);
Tr = ftell(fr)/sizeR;
fseek(fs,0,SEEK_END);
Ts = ftell(fs)/sizeS;
fseek(fs,0,SEEK_SET);
mTs = Ts;
//noi
while(mTs > 0)
{
ks = 0;
js = 0;
do//doc m-1 khoi S
{
if(mTs > bfS)
{
fread(Skhoi[ks], sizeof(struct Sbanghi), bfS, fs);
mTs = mTs - bfS;
ks++;
}
else
{
fread(Skhoi[ks], sizeof(struct Sbanghi),mTs,fs);
js = mTs - 1;
mTs = 0;
}
} while((ks < m-1)&&(mTs > 0));
mTr = Tr;
fseek(fr,0,SEEK_SET);
do
{
if(mTr > bfR)
{
16
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
fread(Rkhoi, sizeof(struct Rbanghi), bfR, fr);
mTr = mTr - bfR;
jr = bfR - 1;
}
else
{
fread(Rkhoi, sizeof(struct Rbanghi), mTr, fr);
jr = mTr - 1;
mTr = 0;
}
NoiRS();
}while(mTr > 0);
}
fclose(fr);
fclose(fs);
fclose(frs);
fRS = fopen(RSname1,"w");
frs = fopen(RSname,"rb");
fseek(frs,0,SEEK_END);
Trs = ftell(frs)/sizeRS;
fseek(frs,0,SEEK_SET);
//xem ket qua
printf("\n");
printf("\n");
printf("\n");
printf(" *************************************************
\a");
printf("\n");
printf("\n BANG RS\n");
printf(" _______");
printf("\n");
printf("\n");
printf("\n A B C \n");
fprintf(fRS, "\n\t\t\t BANG RS \n\n");
fprintf(fRS, " \t\t\t");
17
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
fprintf(fRS, "\n\t\t\t A\t B\t C\t\n");
fprintf(fRS, "\t\t\t");
for(i = 1; i <= Trs; i++)
{
fread(&RS, sizeof(struct RSbanghi), 1, frs);
printf("\n %2d %2d %2d \n", RS.A, RS.B,
RS.C);
fprintf(fRS, "\n\t\t\t %3d\t %2d\t %3d\t\n", RS.A, RS.B, RS.C);
fprintf(fRS, "\t\t\t");
d++;
}
printf("\n***** Tong so luong cac bo trong file RS sau khi noi R va S la :
%d",d);
printf("");
// fprintf(fRS,"\n**** Tong so ban ghi trong baang RS (phuong phap chon
tren tich) la : %d\n",d);
fclose(frs);
}
int main()
{
ghiRS();
getch();
}
2.2.2 Thuật toán nối 2 quan hệ bằng phương pháp sắp nối.
a. Cấu trúc file R2.DAT, S2.DAT, RS2.DAT
- Quan hệ R2 (A,B )
+ R2.A có kiểu int : có các số trong file R.DAT đã được sắp xếp
+ R2.B có kiểu int : có các số trong file R.DAT đã được sắp xếp
- Khai báo : struct R2 {
int A;
int B;
};
Cài đặt quan hệ R2 dưới dạng file có tên là R2.dat chứa các bản ghi kiểu R2 ,
các bản ghi có trường B giống nhau được đặt liên tiếp nhau và được sắp xếp, có J
giá trị R2.B.
- Quan hệ S2 ( B,C )
18
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
+S2.B có kiểu int : có các số trong file S.DAT đã được sắp xếp
+S2.C có kiểu int : có các số trong file S.DAT đã được sắp xếp
- Khai báo : Struct S2{
int C;
int B;
};
Cài đặt quan hệ S2 dưới dạng file có tên là S2.dat chứa các bản ghi có S2.B
giống nhau được đặt liên tiếp nhau và được sắp xếp. Có I giá trị S2.B ta giả định
S2.B ⊆ R2.B ⇒ J < I
- Quan hệ RS2: là nối tự nhiên của 2 quan hệ R2 và S2
+RS2.A có kiểu int
+RS2.B có kiểu int
+RS.C có kiểu int
b. Cấu trúc bộ nhớ trong M :
Số bản ghi của R là Tr.
Số bản ghi của S là Ts .
Giả sử Tr > Ts : Tr = 1000, Ts = 500.
Khối bộ nhớ để đọc R có cấu trúc:
struct Rbanghi MRkhoi[bfR];
Khối bộ nhớ để đọc S trong phương pháp sắp nối có cấu trúc:
struct Sbanghi MSkhoi[bfS];
c. Thiết kế giải thuật:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define max 100 // so cuc dai ban ghi kha noi
#define bfR 15
#define bfS 15
#define bfRS 10
#define oo 100000
FILE *fr, *fs, *frs, *fRS;
char *Rname = "R.DAT";
char *Sname = "S.DAT";
19
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
char *RSname = "RS2.DAT";
char *RSname1 = "RS2.TXT";
int sizeR, sizeS, sizeRS;
int pR, pS;//con tro file
int Ts, mTs;//so ban ghi con lai cua S
int Tr, mTr;//so ban ghi con lai cua R
int Trs;
int js;//ban ghi cuoi trong khoi cua S
int jr;//ban ghi cuoi trong khoi cua R
int jrs;//ban ghi cuoi trong khoi cua RS
int k, i, j, d = 0;
struct Rbanghi { int A, B; };
struct Sbanghi { int B, C; };
struct RSbanghi { int A, B, C; };
struct Rbanghi R, MRkhoi[bfR];
struct Sbanghi S, MSkhoi[bfS];
struct RSbanghi RS;
int mB; //thuoc tinh B chung
int RA[max], SC[max];//mang chua thuoc tinh A va C noi voi mB
int jra, jsc; //phan tu cuoi trong RA va SC
void Case1();//R.B=S.B
void Case2();//R.B>S.B
void Case3();//R.B<S.B
void GhiRS();
void NoiRS();
void Case1()
{
if (MRkhoi[i].B > mB)
{
GhiRS();
mB = MRkhoi[i].B;
jra = 0;
RA[jra] = MRkhoi[i].A;
20
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
jsc = 0;
SC[jsc] = MSkhoi[j].C;
}
else
{
jra++;
RA[jra] = MRkhoi[i].A;
jsc++;
SC[jsc] = MSkhoi[j].C;
}
}
void Case2()
{
if (MSkhoi[j].B > mB)
{
GhiRS();
}
else
{
jsc++;
SC[jsc] = MSkhoi[j].C;
}
}
void Case3()
{
if (MRkhoi[j].B > mB)
{
GhiRS();
}
else
{
jra++;
RA[jra] = MRkhoi[i].A;
}
}
void GhiRS()
21
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
{
int p, q;
for (p = 0 ; p <= jra; p++)
for (q = 0; q <= jsc; q++)
{
RS.B = mB;
RS.A = RA[p];
RS.C = SC[q];
fwrite(&RS, sizeof(struct RSbanghi), 1, frs);
}
jra = -1; jsc = -1;
}
void NoiRS()
{
sizeR = sizeof(R);
sizeS = sizeof(S);
sizeRS = sizeof(RS);
mB = -oo; jra = -1;
jsc = -1;jr =-1;
js=-1;
/* mo file */
fr = fopen(Rname, "rb");
fs = fopen(Sname, "rb");
frs = fopen(RSname, "wb");
fseek(fr, 0, SEEK_END);
Tr = ftell(fr)/sizeR;
fseek(fs, 0, SEEK_END);
Ts = ftell(fs)/sizeS;
fseek(fs, 0, SEEK_SET);
fseek(fr, 0, SEEK_SET);
mTs = Ts; mTr = Tr;
/*noi*/
while ((mTr > 0) && (mTs > 0))
{
if (jr < 0) //doc 1 khoi R
22
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
{
if (mTr > bfR)
{
fread(MRkhoi, sizeof(struct Rbanghi), bfR, fr);
mTr = mTr - bfR; jr = bfR-1; i = 0;
}
else
{
fread(MRkhoi, sizeof(struct Rbanghi), mTr, fr);
jr = mTr-1;mTr = 0; i = 0;
}
}
if (js < 0) //doc 1 khoi S
{
if (mTs > bfS)
{
fread(MSkhoi, sizeof(struct Sbanghi), bfS, fs);
mTs = mTs - bfS; js = bfS-1; j = 0;
}
else
{
fread(MSkhoi, sizeof(struct Sbanghi), mTs, fs);
js = mTs-1; mTs = 0; j = 0;
}
}
while ((i <= jr) && (j <= js))
{
if (MRkhoi[i].B == MSkhoi[j].B)
{
Case1();
i++; j++;
if (i > jr)
{
jr = -1;
}
if (j > js)
{
js = -1;
}
23
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
}
else
if (MRkhoi[i].B > MSkhoi[j].B)
{
Case2();
j++;
if (j > js)
{
js = -1;
}
}
else
{ Case3();
i++;
if (i > jr)
{
jr = -1;
}
}
}
}
// Xu ly ban ghi conlai
while (mTr > 0)
{
if (jr < 0) //doc 1 khoi R
{
if (mTr > bfR)
{
fread(MRkhoi, sizeof(struct Rbanghi), bfR, fr);
mTr = mTr - bfR; jr = bfR-1; i = 0;
}
else
{
fread(MRkhoi, sizeof(struct Rbanghi), mTr, fr);
jr = mTr-1;mTr = 0; i = 0;
}
}
while ((i <= jr) && (MRkhoi[i].B == mB))
{
24
Nhóm Su Khoi – Đề tài Cơ Sở Dữ Liệu Nâng Cao
jra++;
RA[jra] = MRkhoi[i].A;
i++;
}
if (i > jr)
{
jr = -1;
}
if (MRkhoi[i].B > mB)
{
mTr = 0;
}
}
while (mTs > 0)
{
if (js < 0) //doc 1 khoi S
{
if (mTs > bfS)
{
fread(MSkhoi, sizeof(struct Sbanghi), bfS, fs);
mTs = mTs - bfS; js = bfS-1; j = 0;
}
else
{
fread(MSkhoi, sizeof(struct Sbanghi), mTs, fs);
js = mTs-1; mTs = 0; j = 0;
}
}
while ((j <= js) && (MSkhoi[j].B == mB))
{
jsc++;
SC[jsc] = MSkhoi[j].C;
j++;
}
if (j > js)
{
js = -1;
}
25