代码片段一:select * from
hjt_edb_wlxqjh_detail
where strWlqdId in (
select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId = (
select B.strWlqdId
from hjt_edb_zscjh_info A
inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
where A.strDelFlg = dbo.DELETE_FLG_0()
and A.strZscJhId = 'strZscJhId_1'
)
)
and strZscJhId = 'strZscJhId_1'
代码片段二:select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId = (
select B.strWlqdId
from hjt_edb_zscjh_info A
inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
where A.strDelFlg = dbo.DELETE_FLG_0()
and A.strZscJhId = 'strZscJhId_1'
)
我的问题是为什么‘代码片段一(1秒内)’比‘代码片段二(18秒)’执行的快呢?
我个人认为‘代码片段二’是‘代码片段一’的子查询,速度应该比‘代码片段一’快,求解???
备注:hjt_edb_wlqd_info 100万条数据
hjt_edb_zscjh_info 10万条数据
hjt_edb_wlxqjh_detail 10万条数据
hjt_edb_wlxqjh_detail
where strWlqdId in (
select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId = (
select B.strWlqdId
from hjt_edb_zscjh_info A
inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
where A.strDelFlg = dbo.DELETE_FLG_0()
and A.strZscJhId = 'strZscJhId_1'
)
)
and strZscJhId = 'strZscJhId_1'
代码片段二:select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId = (
select B.strWlqdId
from hjt_edb_zscjh_info A
inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
where A.strDelFlg = dbo.DELETE_FLG_0()
and A.strZscJhId = 'strZscJhId_1'
)
我的问题是为什么‘代码片段一(1秒内)’比‘代码片段二(18秒)’执行的快呢?
我个人认为‘代码片段二’是‘代码片段一’的子查询,速度应该比‘代码片段一’快,求解???
备注:hjt_edb_wlqd_info 100万条数据
hjt_edb_zscjh_info 10万条数据
hjt_edb_wlxqjh_detail 10万条数据
hjt_edb_wlxqjh_detail
where strZscJhId = 'strZscJhId_1'多快?结果集多少数据量?
中,符合条件的数据行很少。去掉这个条件在执行一下看看结果吧。
中,符合条件的数据行很少’这句话是正确的,但是为什么会出现这种情况呢?子查询不是应该比整体查询快吗?
select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId in (
select B.strWlqdId
from hjt_edb_zscjh_info A
inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and A.strDelFlg = B.strDelFlg
where A.strDelFlg = dbo.DELETE_FLG_0()
and A.strZscJhId = 'strZscJhId_1'
)
比如说 select * from
hjt_edb_wlxqjh_detail
where strWlqdId in ( XXX )
)
and strZscJhId = 'strZscJhId_1'
不要IN条件后
select * from
hjt_edb_wlxqjh_detail
where strZscJhId = 'strZscJhId_1' 只出来一条数据 假设这条数据 strWlqdId = 'A'
然后加上IN条件,发现子查询有有一条结果也等于'A',那么数据库是不是就可以把这条记录呈现给你了?
就算子查询有100条 都等于'A',他还是只会返回一条给你,这么做有意义么?事实上,SQL2005之前的数据库会读100条,现在不会
hjt_edb_wlxqjh_detail
where strWlqdId in ( XXX )
)
and strZscJhId = 'strZscJhId_1'
中的and 后面的条件告诉我的,如果没有这个条件,就变成了
把能买的都买回来,那就要问所有饼摊啦
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0" Build="9.00.4035.00" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementCompId="1" StatementEstRows="25" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.0033095" StatementText="select * from tl0912
" StatementType="SELECT">
<StatementSetOptions ANSI_NULLS="false" ANSI_PADDING="false" ANSI_WARNINGS="false" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="false" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="false" />
<QueryPlan DegreeOfParallelism="1" CachedPlanSize="26" CompileTime="0" CompileCPU="0" CompileMemory="96">
<RelOp AvgRowSize="332" EstimateCPU="0.000106" EstimateIO="0.0032035" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="25" LogicalOp="Table Scan" NodeId="0" Parallel="false" PhysicalOp="Table Scan" EstimatedTotalSubtreeCost="0.0033095">
<OutputList>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="single_No" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="subcode" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="item_num" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="Crt_Time" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="ID" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="ChartID" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkNo" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkDate" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkID" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="sect_No2" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="MoveMake_parent" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="MoveMake_Qty" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="TimeCount" />
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="IsOut" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="25" ActualEndOfScans="1" ActualExecutions="1" />
</RunTimeInformation>
<TableScan Ordered="false" ForcedIndex="false" NoExpandHint="false">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="single_No" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="subcode" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="item_num" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="Crt_Time" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="ID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="ChartID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkNo" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkDate" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="WorkID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="sect_No2" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="MoveMake_parent" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="MoveMake_Qty" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="TimeCount" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" Column="IsOut" />
</DefinedValue>
</DefinedValues>
<Object Database="[Jsmis]" Schema="[dbo]" Table="[tl0912]" />
</TableScan>
</RelOp>
</QueryPlan>
</StmtSimple>
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>