使用“数据库引擎优化顾问”来构建正确的索引设计
环境:以AdventureWorks示例数据库为环境。创建两个表,分别为dbo.Orders 和 dbo.OrderDetails。并创建数据USE AdventureWorks
GO
CREATE TABLE dbo.Orders(
SalesOrderID int NOT NULL,
OrderDate datetime NOT NULL,
ShipDate datetime NULL,
Status tinyint NOT NULL,
PurchaseOrderNumber dbo.OrderNumber NULL,
CustomerID int NOT NULL,
ContactID int NOT NULL,
SalesPersonID int NULL
);
CREATE TABLE dbo.OrderDetails(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25),
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal AS (isnull((UnitPrice*((1.0)-UnitPriceDiscount))*OrderQty,(0.0)))
);
INSERT INTO dbo.Orders
SELECT SalesOrderID, OrderDate, ShipDate, Status, PurchaseOrderNumber,CustomerID, ContactID, SalesPersonID FROM Sales.SalesOrderHeader;
INSERT INTO dbo.OrderDetails(SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber,
OrderQty,ProductID, UnitPrice, UnitPriceDiscount)
SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber,OrderQty,
ProductID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail;
使用以下来查询这两个堆结构的表,示例步骤:
1,打开磁盘IO信息,ctrl+M包括实际的执行计划,使用两个select 语句看相关信息
(12 行受影响)
表 'OrderDetails'。扫描计数 1,逻辑读取 802 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Orders'。扫描计数 1,逻辑读取 178 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1366 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderDetails'。扫描计数 1,逻辑读取 802 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Orders'。扫描计数 1,逻辑读取 178 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
2,根据使用“数据库引擎优化顾问”步骤获取的建议索引,创建两个表的索引,再执行这两个select 语句,并看相关信息。
(12 行受影响)
表 'OrderDetails'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Orders'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1366 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'OrderDetails'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Orders'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。比较图:
3,结论:按照忧化顾问,的确效率上改进了几百信。以下为代码过程。 USE AdventureWorks;
--显示磁盘活动量的信息
SET STATISTICS IO ON
SELECT o.SalesOrderID, o.OrderDate, od.ProductID
FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
ON o.SalesOrderID = od.SalesOrderID WHERE o.SalesOrderID = 43659;
SELECT o.SalesOrderID, o.OrderDate, od.ProductID
FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
ON o.SalesOrderID = od.SalesOrderID WHERE o.SalesOrderID BETWEEN 43659 AND 44000;
---------使用忧化顾问,创建索引.
CREATE NONCLUSTERED INDEX [Ncl_index_OrderDetails] ON [dbo].[OrderDetails]
(
[SalesOrderID] ASC
)
INCLUDE ( [ProductID])
CREATE NONCLUSTERED INDEX [Ncl_index_Orders] ON [dbo].[Orders]
(
[SalesOrderID] ASC
)
INCLUDE ( [OrderDate])
以下摘选这里
为了帮助我们设计索引,SQL Server提供了一个称为“数据库引擎优化顾问”的工具。数据库引擎优化顾问需要一个工作负荷文件,该文件可以是包含需要优化的语句的一个文本文件,也可以是SQL Server Profiler生成的一个跟踪文件。随后,“数据库引擎优化顾问”会使用SQL Server 查询优化器和已有的数据库为数据库物理设计结构提出更改建议,例如创建、更改或删除各种索引。
Ø 使用“数据库引擎优化顾问”
1. 打开SQL Server Management Studio。打开“新建查询”窗口并更改数据库上下文为“AdventureWorks”。
2. 键入并执行以下语句,将使用这些语句来通过“数据库引擎优化顾问”优化数据库。
USE AdventureWorks;
SELECT o.SalesOrderID, o.OrderDate, od.ProductID
FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
ON o.SalesOrderID = od.SalesOrderID
WHERE o.SalesOrderID = 43659;
SELECT o.SalesOrderID, o.OrderDate, od.ProductID
FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
ON o.SalesOrderID = od.SalesOrderID
WHERE o.SalesOrderID BETWEEN 43659 AND 44000;
3. 为了将这段脚本存为一个工作负荷文件,需要打开“文件”菜单并选择“另存为”并指定文件名称为dta.sql。
4. 在SQL Server Management Studio中,在“工具”菜单上选择“数据库引擎优化顾问”。连接到SQL Server实例。
5. 选择在步骤3存储的文件作为工作负荷文件并选择数据库“AdventureWorks”作为要优化的数据库。如图6.20所示。
图6.20 选择要优化的数据库
6. 按工具条上的“开始分析”按钮。
7. 在分析完成之后,窗口中将显示建议,如图6.21所示。
8. “数据库引擎优化顾问”建议创建两个索引。可以在“操作”菜单中选择“保存建议”来保存生成索引的脚本。
9. 关闭“数据库引擎优化顾问”。
可以看出,SQL Server会尽可能地优化这两个查询。只有在这两个查询应该被优化并且对它们的优化对数据库的其他操作没有什么影响的时候,才能体现出查询优化的好处。为了优化所有的数据库索引,最好使用SQL Server Profiler 追踪,它会为“数据库引擎优化顾问”提供一个数据库的常规工作负荷。借助于这些信息,“数据库引擎优化顾问”可以根据数据库中的其他负荷来优化查询。在分析完工作负荷后,务必保存并查看建议。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou__zhou/archive/2007/11/02/1863516.aspx