前面一條
在條件上建立索引
ps:第二個,如果select wko_orderno from res_order_cust where wko_so='25063541' 返回的值不唯一 會有語法錯誤
在條件上建立索引
ps:第二個,如果select wko_orderno from res_order_cust where wko_so='25063541' 返回的值不唯一 會有語法錯誤
解决方案 »
- 建一个多个不同计数统计的查询
- 关于使用GROUP BY 查询两张表的疑问
- 菜鸟级问题··
- 有关char、varchar、text类型问题
- sql mail 方面的问题,发送邮箱用的gmail
- 紧急求救!我有一fox数据表文件,其中有一字段(memo类型),其中应该保存了一个图形,我不知道是什么格式,如何读出显示?解决了我大大加分!
- 能否在Select语句中使用存储过程呢?
- 在VB中怎样用ADO 从SQL Server 7.0中导出表到FoxPro、Access、Excel中
- 我的数据库是灰色的,详情请进!!!
- 关于sql server的权限管理的问题
- sqlserver中锁的问题
- 求一公式.急(具体见下)...........
-->
select * from sc_jdbb where wo IN (select wko_orderno from res_order_cust where wko_so='25063541')
ps:但效率不高
*
from
sc_jdbb t
where
exists(select 1from res_order_cust where wko_orderno=t.wo and wko_so='25063541')
还可以试试这个
效率肯定是不高。
但如果在唯一的条件下再比效呢?
select * from sc_jdbb a,res_order_cust b where a.WO=b.WKO_ORDERNO and b.wko_so='25063541'
select * from sc_jdbb where wo=(select wko_orderno from res_order_cust where wko_so='25063541')
select * from sc_jdbb where wo=(select wko_orderno from res_order_cust where wko_so='25063541')
首先,两条语句的作用不一样,也就是得到的结果是不一样的,在某些数据集下,两条语句的返回行的数目是可能不一样的。
其次,第二条语句在某些数据集下可能产生语句执行错误。
再次,在数据符合条件的情况下(也就是返回结果集是一样的)应该是第一条语句的检索速度要快。
ps:不知是你的书写错误还是就是这样,第一条语句的结果集是两个表的字段,第二条语句的结果集是一个表的字段,
自然在res_order是一个宽表的情况下,同时记录数远大于sc_jdbb的话,语句2的速度肯定快于语句1的速度,这里存在数据读取和网络传输的问题。
INTEL 赛扬 3.0GHz
1.5GB RAM
WINDOWS SERVER 2003 SP2
SQLSERVER 2000 SP4被查询表TBL_CRO_CardCapitalFlow有547,778条记录,TBL_CRB_ClientOperationMethod表17条记录。
每一条脚本查询后重启SQLSERVER服务(用于清空内存),重启服务后SQLSERVR.EXE进程内存占用稳定在63,268KB。
第一条查询脚本:
SELECT * FROM TBL_CRO_CardCapitalFlow
WHERE FK_OpCode IN (SELECT PK_OpCode FROM TBL_CRB_ClientOperationMethod WHERE SUBSTRING(PK_OpCode,1,1)='0')
结果:返回记录65,955条,查询后SQLSERVR.EXE进程内存使用261,592KB,耗时21秒
第二条查询脚本:
SELECT * FROM TBL_CRO_CardCapitalFlow AS A, TBL_CRB_ClientOperationMethod AS B
WHERE A.FK_OpCode IN (B.PK_OpCode) AND SUBSTRING(B.PK_OpCode,1,1)='0'
结果:返回记录65,955条,查询后SQLSERVR.EXE进程内存使用261,912KB,耗时1分01秒
如果使用内联 INNER JOIN,速度在上面两者之间,35秒完成,进程的内存占用261,796KB,同样反馈65,955条记录。
SELECT * FROM TBL_CRO_CardCapitalFlow AS A INNER JOIN TBL_CRB_ClientOperationMethod AS B
ON
A.FK_OpCode IN (B.PK_OpCode) AND SUBSTRING(B.PK_OpCode,1,1)='0'
第二条语句如果改成 select * from sc_jdbb where wo in(select wko_orderno from res_order_cust where wko_so='25063541') 就可以加大匹配数据量,获得更多的实验准确度。
如果res_order_cust表中一个wko_so对应少量的wko_orderno, 当然,每二种占优势, 量大自然第一种占优势
因为每二种MSSQL实际是执行两步, 先运行子查询把数据放在临时表中, 再将sc_jdbb和临时表做连接查询
所有如果数据量小的话, 速度还是快, 数据量大的话子查询出来的数据会占用很多的资源, 第一种就有优势了2. 索引指标
如果wko_so是表res_order_cust的主键, WO是表sc_jdbb的主键, 而WO与WKO_ORDERNO又存在外键关系
当然是每一种占优势了
因为MSSQL在优化查询时会先定位b.wko_so='25063541'条件的数据位置, 再关联查询, 自然就快了具体在LZ的系统里MSSQL的解释行为可以通过查询分析器启动显示查询计划来分析
菜单 查询分析器=>查询=>显示执行计划, 然后再F5执行就查询看到了