积极答复者
谁能帮忙优化一下这个sql语句

问题
-
select distinct
e.account as account,
e.so_no as so_no,
e.cbm as cbm,
substring(convert(varchar,e.rec_date,120),0,17)as rec_date,
f.clpno as clpno ,
substring(convert(varchar,g.stuffstart,120),0,17)as stuffstart,
DATEDIFF(dd,e.rec_date,g.stuffstart)as TurnOverDay
from (select DISTINCT
rh.account,
rh.so_no,
rd.rec_date,
sum((rd.length*rd.width*rd.height*rd.ctns)/1000000)as cbm
from
rechead rh inner join recdtl rd on rd.so_no =rh.so_no where rec_date>='2011-06-01' and rec_date < '2011-07-01'
and rh.account like '%wal%' group by rh.account, rh.so_no,rd.rec_date) as e left join outdtl f on e.so_no= f.so_no left join outhead g on f.clpno=g.clpno
答案
-
你好,
根据的语句,需要补充一点。当我们使用Like 语句时候,类似like '%wal%' ,此时你可以查看你的执行计划,是INDEX SCAN,而不是INDEX SEEK。我建议你修改为:like 'wal%'。
当然我们也可以用全文索引,关于创建全文索引,请参阅:
CREATE FULLTEXT INDEX (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms187317.aspx
谢谢,
邱爱华
Ai-hua Qiu- 已建议为答案 WeiLin QiaoModerator 2011年7月6日 6:31
- 已标记为答案 WeiLin QiaoModerator 2011年7月11日 6:06
-
Generally speaking, index seek costs less than index scan. But in real world, it depends on number of rows returned by the query.
- 已建议为答案 WeiLin QiaoModerator 2011年7月6日 6:31
- 已标记为答案 WeiLin QiaoModerator 2011年7月11日 6:06
全部回复
-
select distinct e.account as account, e.so_no as so_no, e.cbm as cbm, --substring(convert(varchar,e.rec_date,120),0,17) as rec_date, --转成120格式,前17位,直接这样既可 convert(varchar(16),e.rec_date,120) as rec_date f.clpno as clpno , --substring(convert(varchar,g.stuffstart,120),0,17)as stuffstart, convert(varchar(16),g.stuffstart,120) as stuffstart datediff(dd,e.rec_date,g.stuffstart)as TurnOverDay from (select --已经根据三个字段group by 了,不需要再distinct了 rh.account, rh.so_no, rd.rec_date, sum((rd.length*rd.width*rd.height*rd.ctns)/1000000)as cbm from rechead rh inner join recdtl rd on rd.so_no =rh.so_no where rec_date>='2011-06-01' and rec_date < '2011-07-01' and rh.account like '%wal%' group by rh.account, rh.so_no,rd.rec_date) as e left join outdtl f on e.so_no= f.so_no left join outhead g on f.clpno=g.clpno
-
你好,
根据的语句,需要补充一点。当我们使用Like 语句时候,类似like '%wal%' ,此时你可以查看你的执行计划,是INDEX SCAN,而不是INDEX SEEK。我建议你修改为:like 'wal%'。
当然我们也可以用全文索引,关于创建全文索引,请参阅:
CREATE FULLTEXT INDEX (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms187317.aspx
谢谢,
邱爱华
Ai-hua Qiu- 已建议为答案 WeiLin QiaoModerator 2011年7月6日 6:31
- 已标记为答案 WeiLin QiaoModerator 2011年7月11日 6:06
-
Generally speaking, index seek costs less than index scan. But in real world, it depends on number of rows returned by the query.
- 已建议为答案 WeiLin QiaoModerator 2011年7月6日 6:31
- 已标记为答案 WeiLin QiaoModerator 2011年7月11日 6:06