SQL Server 2008數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)與索引優(yōu)化向?qū)еg的差別
除了可以處理 Microsoft SQL Server 的新數(shù)據(jù)庫(kù)功能以外,數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)在具體操作方面也不同于 Microsoft SQL Server 2000 索引優(yōu)化向?qū)А1M管這兩個(gè)工具都提供了圖形用戶界面 (GUI) 和命令提示符界面,但熟悉索引優(yōu)化向?qū)У挠脩魬?yīng)注意以下更改。
有關(guān)數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)的新功能的完整列表,請(qǐng)參閱數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)功能。 優(yōu)化數(shù)據(jù)庫(kù)所需的權(quán)限
在 SQL Server 2000 中,只有 sysadmin 固定服務(wù)器角色的成員可以使用索引優(yōu)化向?qū)?lái)優(yōu)化數(shù)據(jù)庫(kù)。在 SQL Server 中,通過(guò)使用數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn),sysadmin 角色的成員仍可以優(yōu)化數(shù)據(jù)庫(kù),但目前 db_owner 固定數(shù)據(jù)庫(kù)角色的成員同樣可以優(yōu)化自己所擁有的數(shù)據(jù)庫(kù)。 ms173448.note(zh-cn,SQL.100).gif注意: 首次使用時(shí),必須由具有系統(tǒng)管理員權(quán)限的用戶啟動(dòng)數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)以初始化應(yīng)用程序。初始化后,sysadmin 固定服務(wù)器角色的成員和 db_owner 固定數(shù)據(jù)庫(kù)角色的成員都可以使用數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)來(lái)優(yōu)化數(shù)據(jù)庫(kù)。但請(qǐng)注意,db_owner 角色成員只可以優(yōu)化自己所擁有的數(shù)據(jù)庫(kù)。有關(guān)詳細(xì)信息,請(qǐng)參閱初始化數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)。
工作負(fù)荷上下文
索引優(yōu)化向?qū)褂眠x定要優(yōu)化的數(shù)據(jù)庫(kù)來(lái)評(píng)估工作負(fù)荷中的每條語(yǔ)句,而不管該語(yǔ)句最初是否是在該數(shù)據(jù)庫(kù)的上下文中執(zhí)行的。索引優(yōu)化向?qū)г谝粋€(gè)優(yōu)化會(huì)話中只能優(yōu)化一個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)可以在一個(gè)優(yōu)化會(huì)話期間優(yōu)化多個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)使用腳本中的信息確定語(yǔ)句運(yùn)行所在的數(shù)據(jù)庫(kù),并針對(duì)該數(shù)據(jù)庫(kù)評(píng)估此語(yǔ)句。選定要優(yōu)化的數(shù)據(jù)庫(kù)不會(huì)影響評(píng)估語(yǔ)句的方式。
例如:
* AdventureWorks 數(shù)據(jù)庫(kù)包含一個(gè) Person.Contact 表,該表中包含 FirstName 和 LastName 列。 * 工作負(fù)荷 TuneQuery.sql 包含以下查詢: 復(fù)制代碼
SELECT FirstName, LastName FROM Person.Contact WHERE LastName = 'Abercrombie'; GO
* 在默認(rèn)情況下,User1 連接到 MyDB 數(shù)據(jù)庫(kù)。
在 SQL Server 2000 中,User1 從命令行發(fā)出以下命令,或使用索引優(yōu)化向?qū)?GUI 執(zhí)行類似的步驟: 復(fù)制代碼
Itwiz -D AdventureWorks -I TuneQuery.sql –o rec.sql –U <username> –P <password>
此方法有效,因?yàn)?TuneQuery.sql 中的每條語(yǔ)句均針對(duì) AdventureWorks 數(shù)據(jù)庫(kù)(因?yàn)槊钚?-D AventureWorks 中指定了它)進(jìn)行了分析。TuneQuery.sql 在 AdventureWorks 數(shù)據(jù)庫(kù)中有效,優(yōu)化繼續(xù)進(jìn)行,并且未出現(xiàn)任何問(wèn)題。
使用數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)時(shí),命令行語(yǔ)法為: 復(fù)制代碼
dta -s Session1 –D AdventureWorks –if TuneQuery.sql –of rec.sql –U username –P password
由于默認(rèn)情況下,User1 連接到 MyDB 數(shù)據(jù)庫(kù),因此系統(tǒng)將數(shù)據(jù)庫(kù)上下文設(shè)置為 MyDB。然后,對(duì) MyDB 數(shù)據(jù)庫(kù)而不是對(duì) AdventureWorks 分析 Transact-SQL 語(yǔ)句。該語(yǔ)句在 MyDB 中無(wú)效,因此被忽略。
為什么會(huì)出現(xiàn)這種情況?如果 User1 在未指定目標(biāo)數(shù)據(jù)庫(kù)的情況下使用 sqlcmd 或 SQL Server Management Studio 來(lái)執(zhí)行 TuneQuery.sql,則 TuneQuery.sql 將針對(duì) MyDB 執(zhí)行分析,這將導(dǎo)致分析失敗。數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)的操作與此類似。
應(yīng)執(zhí)行什么操作?采用以下方法將 USE <database> 語(yǔ)句添加到腳本 TuneQuery.sql 中: 復(fù)制代碼
USE AdventureWorks; GO SELECT FirstName, LastName FROM Person.Contact WHERE LastName = 'Abercrombie'; GO
數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)首先查看語(yǔ)句 USE AdventureWorks 并使用該信息將當(dāng)前數(shù)據(jù)庫(kù)設(shè)置為 AdventureWorks。然后,數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)在查看語(yǔ)句 SELECT FirstName, LastName FROM Person.Contact WHERE LastName = 'Abercrombie' 時(shí)將針對(duì) AdventureWorks 分析該語(yǔ)句(因?yàn)楫?dāng)前數(shù)據(jù)庫(kù)上下文為 AdventureWorks)。這樣,數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)就可以成功優(yōu)化數(shù)據(jù)庫(kù)。請(qǐng)注意,如果使用 sqlcmd 或 SQL Server Management Studio 執(zhí)行以上腳本,則系統(tǒng)將針對(duì) AdventureWorks 執(zhí)行該語(yǔ)句,這是因?yàn)榈谝粋€(gè) USE <database> 語(yǔ)句將數(shù)據(jù)庫(kù)上下文從 MyDB 更改為 AdventureWorks。
USE <database> 語(yǔ)句可用于指定要對(duì)其執(zhí)行語(yǔ)句的數(shù)據(jù)庫(kù)。通常情況下,如果每條語(yǔ)句都使用完全限定的表名,則沒(méi)有必要進(jìn)行該操作。
由于數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)嘗試查找每條語(yǔ)句運(yùn)行所針對(duì)的相應(yīng)數(shù)據(jù)庫(kù)(以模擬執(zhí)行環(huán)境),因此以下信息對(duì)于了解數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)如何處理不同類型的輸入很重要。 SQL 文件/內(nèi)聯(lián)工作負(fù)荷
正如在前面部分中提到的,數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)使用 USE <database> 語(yǔ)句(位于 Transact-SQL 查詢之前)標(biāo)識(shí)對(duì)其執(zhí)行查詢的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)從 Transact-SQL 腳本文件中的第一條語(yǔ)句開(kāi)始查看輸入。它首先假設(shè)當(dāng)前數(shù)據(jù)庫(kù)是默認(rèn)數(shù)據(jù)庫(kù)。由于存在 USE <database> 語(yǔ)句,因此會(huì)更改當(dāng)前數(shù)據(jù)庫(kù)的上下文(這些語(yǔ)句是針對(duì)當(dāng)前數(shù)據(jù)庫(kù)進(jìn)行分析的)。 跟蹤文件和跟蹤表
數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)在分析跟蹤文件時(shí)模仿 SQL Server Profiler的重播。它按照列出的順序使用跟蹤文件中的下列信息:
* 如果跟蹤文件包含填充了 DatabaseName 列的事件,則數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)將使用該列查找對(duì)其執(zhí)行該事件的數(shù)據(jù)庫(kù)。 * 如果跟蹤文件填充了 DatabaseID 列,則數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)將使用該列查找對(duì)其執(zhí)行該事件的數(shù)據(jù)庫(kù)。它將查詢系統(tǒng)目錄以找到與 DatabaseID 相對(duì)應(yīng)的數(shù)據(jù)庫(kù)名稱。
ms173448.note(zh-cn,SQL.100).gif注意: 如果在收集跟蹤文件后分離、附加、刪除或創(chuàng)建了數(shù)據(jù)庫(kù),則 DatabaseID 和 DatabaseName 映射可能不會(huì)保持與創(chuàng)建跟蹤文件時(shí)相同的狀態(tài)。數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)無(wú)法確定此信息。如果出現(xiàn)這種情況,則應(yīng)從跟蹤文件中完全刪除 DatabaseID,以防止數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)優(yōu)化錯(cuò)誤的數(shù)據(jù)庫(kù)。
* 如果跟蹤文件中不存在 DatabaseName 或 DatabaseID 列,則數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)確定要用于每條語(yǔ)句的數(shù)據(jù)庫(kù)的方式與確定要用于跟蹤文件中的每個(gè) SPID 列的 Transact-SQL 腳本的方式相同。如果不存在 SPID 列,則將以與確定 Transact-SQL 腳本完全相同的方式確定數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)在分析每條語(yǔ)句的過(guò)程中還使用登錄信息(如同在 SQL Server Profiler 重播中)。服務(wù)器上的默認(rèn)數(shù)據(jù)庫(kù)隨跟蹤文件中顯示的 LoginName 列值的改變而改變。 ms173448.note(zh-cn,SQL.100).gif注意: 如果跟蹤文件中存在的登錄不再出現(xiàn)在系統(tǒng)中,則數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)將忽略該登錄,并在默認(rèn)情況下使用當(dāng)前正在執(zhí)行優(yōu)化過(guò)程的登錄。如果出現(xiàn)這種情況,則系統(tǒng)將在數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)的優(yōu)化日志中寫入一條消息。
優(yōu)化時(shí)間限制
使用數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)可指定優(yōu)化時(shí)間,或指定無(wú)限制的優(yōu)化時(shí)間。索引優(yōu)化向?qū)形刺峁┐斯δ堋S嘘P(guān)詳細(xì)信息,請(qǐng)參閱限制優(yōu)化的持續(xù)時(shí)間和事件。
