当前位置: 代码迷 >> Sql Server >> 求一条话语的优化
  详细解决方案

求一条话语的优化

热度:54   发布时间:2016-04-27 10:49:44.0
求一条语句的优化
OS windows 2003
 DB sql2005
 服务器 IBM服务器 内存16G 至强CPU3.0 * 2颗
 

[
SQL code
 --TA表 表中数据有160万条记录   create table TA   (BH VARCHAR(10) NULL,    HW VARCHAR(10) NULL,    SL INT    ) --TB表 表中数据有10万条记录  CREATE TABLE TB   (RQ VARCHAR(10 NULL),    BH VARCHAR(10) NULL,    HW VARCHAR(10) NULL,    SL INT   )

   
现在要找出A表中 BH+HW 不在B表中 BH+HW的记录 如何写语句效率最高
我这样写的
SELECT BH,HW,SL FROM TA WHERE BH+HW NOT IN (SELECT BH+HW FROM TB)

这样写的语句执行恨长时间才出结果

------解决方案--------------------
SQL code
SELECT BH,HW,SL FROM TA WHEREnot exists (select 1 from TB where TB.BH+TB.HW=TA.BH+TA.BH);
------解决方案--------------------
bh+hw 是用不到索引的
改成下面的会好些,表a b 上面要有索引。
SQL code
SELECT BH,HW,SL FROM TA WHEREnot exists (select 1 from TB where TB.BH=TB.HW and TA.BH=TA.BH);
------解决方案--------------------
SQL code
select BH,HW,SL from TAwhere not exists (select 1 from TB where TB.BH+TB.WH=TA.BH+TA.WH)
------解决方案--------------------
数据量这么大,怀疑SQL SERVER根本不会用到索引。 基本照着HASH去了,可以贴一下执行计划吗?
------解决方案--------------------
SELECT TA.BH,TA.HW,TA.SL FROM TA,TB WHERE
CHARINDEX(TA.BH+TA.BH,TB.BH+TB.HW)<=0
------解决方案--------------------
SQL code
--if object_id('TA') is not null --    drop table TA--Go--create table TA--(--BH VARCHAR(10) NULL,--HW VARCHAR(10) NULL,--SL INT--)--if object_id('TB') is not null --    drop table TB--Go--CREATE TABLE TB--(--RQ VARCHAR(10) NULL,--BH VARCHAR(10) NULL,--HW VARCHAR(10) NULL,--SL INT--)IF OBJECT_ID('tempdb..#tmp_TA') IS NOT NULL    DROP TABLE #tmp_TASELECT *,BH+HW AS IDEN INTO #tmp_TA FROM TAIF OBJECT_ID('tempdb..#tmp_TB') IS NOT NULL    DROP TABLE #tmp_TBSELECT *,BH+HW AS IDEN INTO #tmp_TB FROM TBCREATE NONCLUSTERED INDEX #tmp_TA_IDEN ON #tmp_TA(IDEN)CREATE NONCLUSTERED INDEX #tmp_TB_IDEN ON #tmp_TB(IDEN)SELECT BH,HW,SL FROM #tmp_TA AS a WHERE NOT EXISTS(SELECT 1 FROM #tmp_TB AS x WHERE a.IDEN=x.IDEN)
  相关解决方案