当前位置: 代码迷 >> Sql Server >> 关于查询执行规则
  详细解决方案

关于查询执行规则

热度:14   发布时间:2016-04-24 09:03:30.0
关于查询执行规则,请教大家
大家好
有一个表A,数据有20000行,一个表B,十万行,
inner join 通过 表A字段B_ID(非聚集索引)和表B字段ID (聚集索引)连接,
表A有一个字段class (建索引)
现在有这样一个查询
select * from A
join B on A.B_ID=B.Id
where A.class=1 and CharIndex('搜索关键字',b.name)>0

我想问的是,我通过where A.class=1这一部分筛选后,记录已经只有200行,
那么第二个条件CharIndex('搜索关键字',b.name)>0会去表B 10万行记录里面去表扫描吗?
还是只是在第一个结果的200行里面做表扫描?

------解决思路----------------------
不会,过滤率高的条件放前面就有这样的好处
应该是在第一个结果的200行里面做表扫描

具体你还可以贴上执行计划看一下
------解决思路----------------------
USE TEMPDB
GO
IF OBJECT_ID('TA') IS NOT NULL DROP TABLE TA
GO
CREATE TABLE TA(
ID UNIQUEIDENTIFIER PRIMARY KEY
,B_ID UNIQUEIDENTIFIER
,VAL VARCHAR(8000)
,class int
)
GO
CREATE INDEX INX_TA_B_ID ON TA(B_ID)
CREATE INDEX INX_TA_class ON TA(class)
GO
INSERT INTO TA
SELECT TOP 20000
NEWID()
,NEWID()
,REPLICATE('A',8000)
,ltrim(ABS(CHECKSUM(NEWID())%100))
FROM SYS.objects T1,SYS.objects T2,SYS.objects T3
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
ID UNIQUEIDENTIFIER PRIMARY KEY
,NAME VARCHAR(8000)
)
GO
INSERT INTO TB
SELECT TOP 80000
NEWID()
,REPLICATE('A',8000)
FROM SYS.objects T1,SYS.objects T2,SYS.objects T3
UNION ALL
SELECT 
B_ID
,ltrim(ABS(CHECKSUM(NEWID())%100))
FROM TA
go
set nocount on
go
set showplan_text on
go
select t1.*
from ta t1
inner join tb t2 on t1.B_ID=t2.ID and CHARINDEX('2',t2.NAME)>0
where t1.class=1
go
set showplan_text off
go
/*
StmtText
------------------------------------------------------------------------------------------------------------
select t1.*
from ta t1
inner join tb t2 on t1.B_ID=t2.ID and CHARINDEX('2',t2.NAME)>0
where t1.class=1

StmtText
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  
------解决思路----------------------
--Nested Loops(Inner Join, OUTER REFERENCES:([t1].[B_ID]) OPTIMIZED)
       
------解决思路----------------------
--Clustered Index Scan(OBJECT:([tempdb].[dbo].[TA].[PK__TA__3214EC276C28BFBD] AS [t1]), WHERE:([tempdb].[dbo].[TA].[class] as [t1].[class]=(1)))
       
------解决思路----------------------
--Clustered Index Seek(OBJECT:([tempdb].[dbo].[TB].[PK__TB__3214EC2768582ED9] AS [t2]), SEEK:([t2].[ID]=[tempdb].[dbo].[TA].[B_ID] as [t1].[B_ID]),  WHERE:(charindex('2',[tempdb].[dbo].[TB].[NAME] as [t2].[NAME])>(0)) ORDERED FORWARD)


*/


我试了一下,就是你预期的计划,B表是走聚集索引查找
  相关解决方案