连结类型。使用SQL-92 语法,您可以重写之前的查询,如下:
SELECT OrderID, CustomerID, Employees.EmployeeID, Firstname,
LastName, OrderDate
FROM Orders INNER HASH JOIN Employees
ON (Orders.EmployeeID = Employees.EmployeeID)
联结提示是进阶的主题,我们并不能提供使用的经验方法。有很多不同的选择特殊联结操作的原因,例如同等运算子的数目、在联结中每个数据表的大小,以及联结的多少数据表。有一种最佳的途径可以确定更改联结操作是否将提供额外的效能,就是在 Query Analyzer 中尝试每一种类型的联结,看看哪种可以提供最小的消耗。当然,Query Optimize r通常会为帮助选择最佳的联结操作。
查询提示
查询提示(query hints)用来指定如何执行特定的查询操作。可用的查询操作分为三类:分组(group by)、联合(union)和混杂(miscellaneous)。
分组提示 下面的提示指定了如何执行 GROUP BY 或 COMPUTE 操作:
• HASH GROUP BY 指定使用杂凑函数来执行 GROUP BY 操作。
• ORDER GROUP BY 指定使用排序操作来执行 GROUP BY 操作。
使用前面的 GROUP BY 范例(请参阅本章的 <检视总计操作> 一节),您可以按照下面使用提示来指定如何执行 HASH GROUP BY 操作:
SELECT CustomerID, SUM(OrderDetails.UnitPrice)
FROM Orders, OrderDetails
HASH GROUP BY CustomerID
OPTION(HASH GROUP)
________________________________________
说明
GROUP BY 提示彼此独立-每次只能使用其中一种。
________________________________________
联合提示 下面的提示是用来指定如何执行 UNION 操作:
• MERGE UNION 使用合并操作来执行 UNION。
• HASH UNION 使用杂凑函数来执行 UNION。
• CONCAT UNION 使用串联功能来执行 UNION。
这是一个使用 CONCAT UNION 提示的范例:
SELECT OrderID, CustomerID, EmployeeID, OrderDATE
FROM orders
WHERE CustomerID = 'TOMSP'
UNION
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders
WHERE EmployeeID = '4'
OPTION (CONCAT UNION)
________________________________________
说明
UNION 提示也是彼此独立的。
________________________________________
不幸的是,没有任何一定的公式可用以确定哪种 UNION 操作在您的环境中执行的最好。再一次说明,最好的途径就是使用 Query Analyzer 来尝试不同的 UNION 提示,看看哪种可以提供最少的消耗。通常
SQL Server Query Optimizer 可以为 UNION 提示决定最佳策略。
杂项提示 下面的提示可以用来执行多种的查询操作:
• FORCE ORDER 强制查询按照查询中数据表出现的次序执行。在预设状态下,
SQL Server 可以重新排序数据表存取。
• ROBUST PLAN 强制 Query Optimizer 预备取得最有可能的最大数据列数。
以下是使用这个提示的范例:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (ROBUST PLAN)
资料表提示
数据表提示 (table hints)用来控制数据表存取,两种数据表提示如下:
• FAST n 替代 FASTFIRSTROWS,用来保持向后的兼容性。最佳化查询以获得最前面n列的数据。
• INDEX=index_name 强制 Query Optimizer 在可能时使用指定的索引。在本章中的前面的范例之一示范了如何使用 INDEX 提示:
• SELECT OrderID, CustomerID, EmployeeID, OrderDate
• FROM orders WITH (INDEX = EmployeeID)
• WHERE EmployeeID = 5
OPTION (FAST 10)
WITH是选择性的。
这里的 INDEX = EmployeeID 提示将指定使用 EmployeeID 索引。透过指定FAST 10,
SQL Server 将最佳化前面 10 列的取得(如果可能的话),然后传回剩下的列。
本章总结
在本章中,您学到了如何使用 Query Analyzer 以确定对查询最佳的执行计划和数据存取方法。另外,您还学到了如何使用 Profiler 来检视系统中执行的 T-SQL 陈述式,以及如何执行追踪来确定是否其中一些 T-SQL 陈述式可能导致效能问题。还讨论了如何根据您的
数据库和数据以最佳化执行计划和
数据库存取方法。最后,您学到了如何使用提示来指定一个特定的执行计划或数据存取方法。在 第 36 章 中,您学习的主题将发展为效能问题以及如何解决效能问题。