本文共 3103 字,大约阅读时间需要 10 分钟。
R表有20000个元组,每个元组占用1个磁盘块,存储在40个磁盘块中。
S表有1200个元组,每个元组占用1个磁盘块,存储在30个磁盘块中。select * from R;这是一个全表扫描操作。
要读取所有20000个元组,每个元组占用1个磁盘块。磁盘块读取次数 = 20000 / 40 = 500次。select * from R where A=10;由于A字段有3层B+树索引,查找过程如下:
总共需要4次磁盘块读写。
嵌套循环连接需要估算以下代价:
cost = Br + BrBs / (K - 1) + (Frs * Nr * Ns) / Mrs其中: 由于内存缓冲区块数K和存放连接结果的块因子Mrs未知,无法计算具体代价。
排序合并连接时,需要考虑R和S在B属性上的排序情况:
有序的情况:
cost = Br + Bs + (Frs * Nr * Ns) / Mrs其中: 无序的情况:
需要在连接前对R和S的B字段进行排序。排序代价为:(2 * Br + 2 * Br * log2(Br)) + (2 * Bs + 2 * Bs * log2(Bs))其中:log2表示以2为底的对数。分别代入R有500块(每块存储500个元组),S有40块(每块存储30个元组),排序代价约为:
R排序代价:500 * 11000次 ≈ 550000次S排序代价:40 * 480次 ≈ 19200次总排序代价约为114800次。SELECT Cname FROM Student, Course, SC WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Student.Sdept = 'IS';
T1├── JOIN (Student, SC)│ └── JOIN (Course, SC)│ └── SELECT Cname└── WHERE Student.Sdept = 'IS'
T1├── JOIN (Student, SC) [条件:Sno]│ └── JOIN (Course, SC) [条件:Cno]│ └── SELECT Cname└── WHERE Student.Sdept = 'IS'
优化步骤:
其中Tno、Dno、Year字段有B+树索引。
SELECT * FROM Work WHERE Year > 2000 AND Salary < 5000;
优化方法:
SELECT Tname FROM Teacher, Department, Work WHERE Teacher.Tno = Work.Tno AND Department.Dno = Work.Dno AND Department.Dname = '计算机系' AND Salary > 5000;
T2├── JOIN (Teacher, Work) [条件:Tno]│ └── JOIN (Department, Work) [条件:Dno]│ └── WHERE Department.Dname = '计算机系'├── WHERE Salary > 5000└── SELECT Tname
T2├── JOIN (Teacher, Work) [条件:Tno]│ └── JOIN (Department, Work) [条件:Dno]│ └── WHERE Department.Dname = '计算机系'├── WHERE Salary > 5000└── SELECT Tname
优化步骤:
T1: T1 beginT2: T1 readT3: T4 readT4: T4 beginT4: T4 readT4: T4 writeT4: T4 commitT5: T4 readT5: T5 beginT5: T5 readT5: T5 writeT5: T5 commitT6: T5 readT6: T6 beginT6: T6 readT6: T6 writeT6: T6 commitT7: T6 read
T1: T1 beginT2: T1 readT3: T2 readT4: T2 writeT5: T2 commitT6: T3 beginT6: T3 readT6: T3 writeT6: T3 commitT7: T3 read
转载地址:http://wkfz.baihongyu.com/