具体耗时多少没有测,MSSQL2000,SQL如下:select ord_id,ord_no,qty
from s_order_m
where ord_id='A'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')返回行400条,很快。查询分析器 右下角显示耗时:0:00:00
如果改成(ord_id='A'--->ord_id='B'):
select ord_id,ord_no,qty
from s_order_m
where ord_id='B'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')返回行1条,稍慢。查询分析器 右下角显示耗时:0:00:02说明:A代表正常销货,B是退货。主键:ord_id + ord_no若是改成如下,即将具体字段换成:‘*’,查询耗时也是 0:00:00.
select * from s_order_m
where ord_id='B'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')为什么会出现以上这两种情况:
同样的SQL,赋给字段的值不一样,查询效率不一样(在查询分析器看执行计划是不一样的,但看不太懂),返回行少的反而慢?
把字段1、字段2...换成 * 后,反而会快,select * 不是效率会低吗?多谢!!!
from s_order_m
where ord_id='A'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')返回行400条,很快。查询分析器 右下角显示耗时:0:00:00
如果改成(ord_id='A'--->ord_id='B'):
select ord_id,ord_no,qty
from s_order_m
where ord_id='B'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')返回行1条,稍慢。查询分析器 右下角显示耗时:0:00:02说明:A代表正常销货,B是退货。主键:ord_id + ord_no若是改成如下,即将具体字段换成:‘*’,查询耗时也是 0:00:00.
select * from s_order_m
where ord_id='B'
and mat_no in(select mat_no from mat where type_id='01' and type_rem='AAA')为什么会出现以上这两种情况:
同样的SQL,赋给字段的值不一样,查询效率不一样(在查询分析器看执行计划是不一样的,但看不太懂),返回行少的反而慢?
把字段1、字段2...换成 * 后,反而会快,select * 不是效率会低吗?多谢!!!
解决方案 »
- 【高分】SQL SERVER 2008 REPORTSERVICE 如何实现匿名访问设置?
- REFERENTIAL 约束如何使用?
- SQL 2000中,已同步的表,如何修改数据结构?或者自已写同步的语句?
- SQLSERVER 2000 在 RAID服务器上,该如何配置?
- MDB转为SQL后不能增加新数据?
- 如何把数据库中的文件流读出来重新转为文件形式放到固定目录下?
- 此觸發器該如何寫
- Communications link failure due to underlying exception问题,大家进来看看
- 请教contains的问题
- 这样的触发器为什么不行???
- 员工离职后软件数据如何处理
- sql 语句查询字段,根据分隔符截取该字符串,循环输出
改成(ord_id='A'--->ord_id='B'):这个更改查询速度比更改之前慢,可能是符合ord_id='B'的数据量比较大。这个是可能的情况把字段1、字段2...换成 * 后,反而会快? 这个一次的执行计划时间不准确吧,应该不会出现这种情况,你多执行几次看看。
补充说明:
1. 查询执行了不止2~~3次,不同的时间段测试了N次了。
2. ord_id='B'的数据量很少,绝大部分是的ord_id='A'的行。
3. mat in () 子查询返回行不太多,50行左右。
/*从缓冲池中删除所有清除缓冲区。*/dbcc freeproccache
/*从过程缓存中删除所有元素。*/set statistics io on
set statistics time on
go/*--你的sql脚本开始*/然后把你io 信息发上来看看或者自己对比一下
where id=2 --全表扫描你可以这样告诉你的面试者说, 这张表走index_seek 还是 scan 在于需要查找的数据占整张表的比例的大小
一张表走索引还是走全表扫描在于 取出的数据占整张表的百分比一张表10000 条 id 为1 的一条 id为2 的9999where id=1 --index seek
where id=2 --scan
from s_order_m as a
inner join mat as b on a.mat_no=b.mat_no
where a.ord_id='A' and b.type_id='01' and b.type_rem='AAA'select a.*
from s_order_m as a
inner join mat as b on a.mat_no=b.mat_no
where a.ord_id='A' and b.type_id='01' and b.type_rem='AAA'
这两个执行起来有区别吗?
有的,我也测了,还用exists 测了,都一样。
按道理ord_id='B'会更快啊。ord_id='B'的资料行少
做性能测试需要每次都清空缓存,方法楼上有.有时候要测有缓存时候的性能,就不要记录考虑第一次运行的速度,连续运行,取后面的运行速度
你好,是 :A的数量较多,B的数量较少,应该是查询B的时候用到了索引吧???
不太懂,求解。
SQL编辑器工具栏上面,有个三个绿点的图标,点上它运行就可以出执行计划,把它保存后用记事本打开,实际是个XML文件,将XML格式贴出来
像这样<?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>
我用的是mssql2000 ,在查询分析器上有你说的三个绿点的图标,应该是‘显示预计的执行计划’。但显示的结果是图形状的,也不能保存!