图35-7 评估的执行计划窗格显示了使用 PK_Orders 丛集索引。
要 Query Optimizer 使用 EmployeeID 索引,可以使用 SELECT 陈述式的提示(hint),程序代码如下(提示将在本章的 <使用提示> 一节中讨论。):
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders WITH (INDEX ( EmployeeID))
WHERE EmployeeID = 4
________________________________________
说明
在 SQL Server 7 中,较好用的索引提示是 INDEX=index_name。
在 SQL Server 2000 中,较好用的索引提示是 INDEX(index_name)。
________________________________________
透过这个信息,可以指示 Query Optimizer 使用所需要的执行计划,而不是 Query Optimizer 选择的计划。调整过的评估执行计划窗格如图35-8所示。可以从显示的数据存取方法中看到,使用的是 EmployeeID 索引,然后传回一个书签搜寻(bookmark lookup),该查询将获得来自数据库的数据。(书签搜寻搜索一列数据的内部识别码。)
图35-8 调整过后的评估执行的计划窗格
Query Optimizer 是一个有效率的工具,以不断的更新统计数据,提供选择最佳的执行计划。由于不同的公司行号可能更清楚自己的组织和数据,所以某些情况下,公司可以选择比 Query Optimizer 更有效率的最佳执行计划。
________________________________________
注意
使用提示代替 Query Optimizer 的选择时,必须承担变更可能带来的风险。虽然数据遗失或损毁的机率不大,不过可能对系统的执行效能产生的是负面的影响。
________________________________________
检视联结操作
执行联结操作比执行选取操作多出了更过的执行过程,稍后会在评估执行的计划窗格中看到。联结操作会对数个数据表进行存取的动作,并在存取后组合所搜寻的数据。(联结在 第 14 章 中讨论)。请在 Query Analyzer 输入以下的联结操作范例:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders Join Employees ON Orders.EmployeeID = Employees.
EmployeeID
之前的陈述式包括 SQL-92 JOIN 操作元。建议使用此操作元在 SQL Server 2000中执行连结。下面的陈述式使用较传统的连结语法:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
T-SQL 陈述式在 EmployeeID 资料行中联结了 Orders 和 Employees 资料表。评估执行计划结果如图35-9所示。
图35-9 显示在评估执行的计划窗格的联结操作
在窗格中可以看到两个子树中哪个的消耗较大,也可以看到规划联结操作的类型。SQL Server 支持多种不同的联结操作,包括杂凑联结(hash join)、巢状循环联结(nested loops join)和合并联结(merge join)。复杂的联结操作,执行计划会相对的变得复杂。由于您的目的是要减少占用 CPU 时间总量,以及减少执行 I/O 操作的数目,所以必须判断是否使用了好的执行计划。有时可以使用提示来指定需要使用的特殊索引,从而减少 CPU 和 I/O 行为。在这个查询中,由于联结是指定在 WHERE 子句中的唯一操作,这个执行计划应该是最适合的。
检视总计操作
下面显示的 T-SQL 陈述式执行连结操作和总计操作,请在 Query Analyzer 中输入:
SET QUOTED_IDENTIFIER ON
GO
SELECT CustomerID, SUM("Order Details".UnitPrice)
FROM Orders JOIN "Order Details" ON Orders.OrderID = "Order
Details".OrderID
GROUP BY CustomerID
________________________________________
说明
因为数据表名称 Order Details 包含了一个关键词和一个空格,所以必须使用选项 SET QUOTED_IDENTIFIER ON。要获得更多关于这个选项的信息,请参阅《在线丛书》索引中的 SET QUOTED_IDENTIFIER。
________________________________________
这个复合操作的评估执行的计划窗格显示在图35-10。
图35-10 显示在评估执行的计划窗格中的总计操作
检视预存程序
要显示预存程序的执行计划,可以简单的在 Query Analyzer 中呼叫预存程序。Query Analyzer 会显示所呼叫预存程序的评估执行计划,如图35-11所示的 sp_who。(需要注意的是,预存程序的执行计划相当复杂)。即使不确定组成预存程序的 T-SQL 陈述式,也可以显示该预存程序的执行计划。
图35-11 在评估执行的计划窗格中的预存程序
使用对象浏览器
对象浏览器(Object Browser)包含在 SQL Server 2000 中,用来提升 Query Analyzer 的功能。启动 Query Analyzer 时,会在左边窗口看到 对象浏览器 。 对象浏览器 分成数据库对象区和通用对象区两部份。在数据库对象区,可以浏览像数据表和检视表等对象;在通用对象区,可以存取系统对象和菜单。可以利用 物件浏览器 找出所提供的信息后,然后决定用的信息。
数据库对象
对象浏览 顶端部份含有数据库对象,可以立即看到预设数据库以及所建立的数据库,并显示所属的 SQL Server。想要知道在 对象浏览 之中有哪些可用信息,只要展开对象即可。先展开 Northwind 数据库,然后展开 使用者数据表 。现在可看到 Northwind 数据库中可用的数据表,如图35-12所示。
图35-12 检视对象浏览中的数据表
接着展开一个使用者定义数据表,然后展开包含关于字段、索引、条件约束、资源依存性、触发程序信息的数据夹。图35-13显示展开的 Orders 数据表。或者可以展开数据夹,检视关于系统数据表、检视表、预存程序、功能和使用者定义数据类型的信息。
在 Query Analyzer 中提供对象信息,是相当方便的,这样在建立 SQL 陈述式和预存程序时,就不需要再检查 Query Analyzer 以外的对象信息。不但可以在 对象浏览 中检视信息,还可以编辑对象、拖曳对象,甚至可以建立指令码和修改对象,将功能加在一个已经很实用的工具中。
图35-13 展开在对象浏览中的数据表
通用对象
在 对象浏览 较下面的部份是名为通用对象(Common Objects)的数据夹,这个数据夹中包含了如设定功能、光标功能、日期和时间功能以及数学功能等对象信息的数据夹。因此您可以很快地存取一个要使用的功能而不须查询语法。在这个区域展开数据夹的话,将显示设定选项,如图35-14所示。将这些功能拖曳到 Query 窗格中,或者用鼠标点选这个功能以显示一个简要描述。这对于 ad-hoc 查询过程是相当方便的。
图35-14 在对象浏览的通用对象中展开一个数据夹
除了存取全域变量之外,您还可以存取很多其它有用的快捷菜单,如数学和字符串功能。继续展开对象,您可以用这些菜单得到参数要求的信息。例如,图35-15显示展开 数学函数 中的 参数 数据夹。