/********* 使用Hints联结 ***************/
/********* 3w@live.cn 邀月 ************/
USE TestDb2
GO
IF NOT OBJECT_ID('HintsDemo','U') IS NULL
DROP TABLE HintsDemo
GO
IF NOT OBJECT_ID('HintsDemo2','U') IS NULL
DROP TABLE HintsDemo2
GO
----创建测试数据表
CREATE TABLE dbo.HintsDemo (HID int ,HTitle Nvarchar(50))
GO
CREATE TABLE dbo.HintsDemo2 (HID2 int ,HID int)
GO
----插入20条数据
INSERT HintsDemo(HID,HTitle)
VALUES ( cast(rand()*10 AS INT),replicate('X',cast(rand()*25 AS INT)) )
GO 20--重复该语句20次,邀月注
INSERT HintsDemo2
SELECT TOP 10 cast(rand()*10 AS INT), HID from HintsDemo
GO 2--重复该语句2次,邀月注
--此时两个表各有20条记录
SELECT * FROM HintsDemo
SELECT * FROM HintsDemo2
SET SHOWPLAN_XML ON
GO
SELECT h.HID,h.HTitle,d.HID2
FROM HintsDemo h
INNER JOIN HintsDemo2 d ON
h.HID = d.HID
GO
SET SHOWPLAN_XML OFF
GO
--先清除过程缓存,!!!请不要在生产环境中使用下句
DBCC FREEPROCCACHE
/* DBCC execution completed. If DBCC printed error messages, contact your system administrator.*/
DECLARE @HintsTitleDemo nvarchar(50) = '0E2FAB59-9A22-4E14-B7BE-33AB500E3B9E'
SELECT HID,HTitle
FROM HintsDemo
WHERE HTitle = @HintsTitleDemo
ORDER BY HID
OPTION (RECOMPILE)--强制重新编译
--不锁定执行查询
SELECT HID,HTitle
FROM HintsDemo
WITH (NOLOCK)
WHERE HID = 4
/*
HID HTitle
4 E6DA3DB2-3D41-47B4-B4E3-DDA90918434C
4 1C4C9211-EB1C-42B5-A08A-558DC73462B4
4 667C9985-3B0A-4767-AED9-82FEE623433D
*/
NOLOCK表提示让查询在不在被影响的行或数据是放置共享锁--允许你在不被阻塞或不阻塞其他查询的情况下读取(但会遇到“脏读”问题)。
最后,我们来介绍一个SQL Server 2008引入的FORCESEEK表提示,它可以用来将索引扫描替换为索引查找。会有一些原因导致SQL Server产生不良的查询计划。例如表数据经常变化并且信息忆不再准确,或带有拙劣where子句的查询没有为查询优化器过程提供有用的或足够的信息。
如果为了单独查找指定数据,而在检索一行之前对整个非常大的表进行了整表扫描,由此带来的I/O开销当然是不能接受的。假定上面的测试表非常大。
/********* 使用ForceSeek强制覆盖SCAN ***************/
/********* 3w@live.cn 邀月 ************/
--创建一个测试主键
ALTER table dbo.HintsDemo
add PKID int Primary key Identity(101,1)
GO
--此时,SQL Server为我们自动创建一个聚集索引[PK__HintsDem__5E0282723D61619B]
SELECT * FROM dbo.HintsDemo
--创建一个非聚集索引
CREATE NONClustered Index idx_ForceSeekDemo
ON Testdb2.dbo.HintsDemo(HTitle)
----select *,Row_Number() over(Partition By [HID] Order by [HID] Asc) As RowID
---- from HintsDemo;
SET SHOWPLAN_XML ON
GO
SELECT DISTINCT HTitle from HintsDemo
WHERE HID BETWEEN 8 AND 10 and HTitle ='141466E4-E8CC-4219-A9AF-7C0D2B86A668'
GO
SET SHOWPLAN_XML OFF
SELECT DISTINCT HTitle from HintsDemo WITH (FORCESEEK,INDEX(idx_ForceSeekDemo))
WHERE HID BETWEEN 8 AND 10 and HTitle ='141466E4-E8CC-4219-A9AF-7C0D2B86A668'
GO