1、建立示例數據庫(TestDB):
USE [master]
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TestDB')
DROP DATABASE [TestDB]
CREATE DATABASE [TestDB]
2、建立一張新表(Nums,該方法來源SQL SERVER 2005技術內幕:查詢):
USE [TestDB]
GO
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO
3、我們刪除聚集索引
USE [TestDB]
GO
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Nums]') AND name = N'PK_Nums')
ALTER TABLE [dbo].[Nums] DROP CONSTRAINT [PK_Nums]
4、對無索引表執行T-SQL語句:
4.1、語句:SELECT n FROM [TestDB].[dbo].[Nums]
選擇包括實際的執行計劃,我們將看到:
SELECT
表掃描(Table Scan):該運算符從 參數(Argument) 列中指定的表中檢索所有行。如果 Argument 列中出現 WHERE:() 謂詞,則僅返回滿足該謂詞的行。它既是一個邏輯運算符,也是一個物理運算符。
箭頭:代表數據流向,高度代表數據的大小。
4.2、語句:INSERT INTO [TestDB].[dbo].[Nums] ([n]) VALUES (1000001)
選擇包括實際的執行計劃,我們將看到:
INSERT:所使用的是通用圖標,生成圖形顯示計劃的邏輯找不到迭代器的合適圖標時,將顯示通用圖標。有下列三種通用圖標:藍色(用于迭代器)、橙色(用于游標)和綠色(用于 Transact-SQL 語言構造)。
表插入(Table Insert):Table Insert 運算符將輸入的行插入到 Argument 列指定的表中。Argument 列中還包含一個 SET:() 謂詞,指示為各個列設置的值。如果 Table Insert 沒有子級插入值,則插入的行是從插入運算符自身獲取的。Table Insert 是一個物理運算符。
4.3、語句:UPDATE [TestDB].[dbo].[Nums] SET n = 1000002 WHERE n = 1000001
選擇包括實際的執行計劃,我們將看到:
UPDATE:同INSERT。
表更新(Table Update):Table Update 物理運算符用于更新在 Argument 列指定的表中的輸入行。SET:() 謂詞用于確定每個已更新列的值。可以在 SET 子句中、此運算符內的其他位置以及此查詢內的其他位置引用這些值。
前幾行(Top):Top 運算符掃描輸入,但僅基于排序順序返回最前面的指定行數或行百分比。Argument 列可以包含要檢查重復值的列的列表。在更新計劃中,Top 運算符用于強制實施行計數限制。Top 既是一個邏輯運算符,也是一個物理運算符。
表掃描(Table Scan):同上,待條件的表掃描。
4.4、語句:DELETE FROM [TestDB].[dbo].[Nums] WHERE n = 1000002
選擇包括實際的執行計劃,我們將看到:
DELECTE:同INSERT。
表刪除(Table Delete):Table Delete 物理運算符用于從參數列內所指定的表中刪除行。