首页 百科知识 查询优化的方法

查询优化的方法

时间:2022-10-17 百科知识 版权反馈
【摘要】:在对表的嵌套查询中,由于数据库指定的策略是对表进行顺序存取,这样可能会对查询效率产生致命的影响。要避免这种情况的主要方法就是对连接的列进行索引。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。将需要查询的表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。

3.8.2 查询优化的方法

(1)记录行上的选择运算应尽可能先做

这是优化中最重要、最基本的一条,选择运算一般使查询的中间结果(记录行)大大变小,从而提高查询效率。

(2)数据列上的投影运算和记录行上的选择运算同时进行

如果需要对同一个表进行多个投影和选择操作,则应避免重复扫描表。

(3)消除对大型表行数据的顺序存取

在对表的嵌套查询中,由于数据库指定的策略是对表进行顺序存取,这样可能会对查询效率产生致命的影响。比如采用顺序存取策略,一个嵌套三层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。要避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和成绩表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

(4)避免相关子查询

一个列的标签同时在主查询和where子句的子查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

(5)使用临时表加速查询

将需要查询的表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。

例如:

img55

如果这个查询要被执行多次而不止一次,可以把所有符合条件的找出来放在一个临时文件中,并按客户的名字进行排序。

  SELECT C.ContactName, C.ContactTitle, C.Address,

       O.ShipName, O.ShipAddress, O.Freight

     FROM Orders O, Customers C

     WHERE C.CustomerID = O.CustomerID

     ORDER BY C.ContactName

     INTO TEMP CustomerOrder

然后以下面的方式在临时表中查询:

  SELECT * FROM CustomerOrder

  WHERE Orders.Freight > 10.00

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

(6)用排序来取代非顺序存取

非顺序磁盘存取是磁盘操作中最慢的操作,因为磁盘的存取臂来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈