sql语句求效率

hb7817810 2011-02-23 05:41:57
系统有4表:auto_payment_due_t、auto_agreement_t、motorised_vehicl01 、workload_t
每表数据大于1000W条。下面查询需要30分钟。
那个大哥能帮忙看看能否优化不?

select a.branch_company_c01,a.policy_no,
a.endorsement_no,
a.product_code,a.department_code, date(a.deal_date),
a.amount,b.selling_channel_01,
c.vehicle_type,c.usage,workload_t.percent
from auto_payment_due_t a inner join workload_t on a.policy_no = workload_t.policy_no,auto_agreement_t b,motorised_vehicl01 c
where date(deal_date) between '01-01-2011' and '01-31-2011'
and a.payment_due_type in ('2','3','4','7') and a.policy_no = b.policy_no
and a.policy_no = c.policy_no and b.policy_no = c.policy_no
...全文
159 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
人鱼传说 2011-02-28
  • 打赏
  • 举报
回复
在12楼的基础上,去掉那个date函数,改为
deal_date>='2011-01-01' and deal_date<'2011-02-01'
feixianxxx 2011-02-25
  • 打赏
  • 举报
回复
1.date(deal_date) between '01-01-2011' and '01-31-2011'
==>
这里不需要用date函数..... 直接用deal_date

2.链接字段 deal_date payment_due_type 都加上索引的 如果有需要
ljking0731 2011-02-25
  • 打赏
  • 举报
回复
policy_no,payment_due_type,deal_date --这三个键做索引

deal_date 做索引后,最好不要这样用date(deal_date),另可去转换between ..and 之间的内容
geliph 2011-02-25
  • 打赏
  • 举报
回复
1. 啥语法哦,wwwwgou帮改的很完美了。
2. 数据table里1000w条数据是根本不算多的。但你得清楚返回集合里有多少条数据。如果你返回500w条和5万条完全不同。
3. 如果你确实为了统计必须返回大记录集,那请不要用tsql,应该用mdx. tsql是用来交易的。
cjh200102 2011-02-25
  • 打赏
  • 举报
回复
加索引。语句把不需要的字段全去掉。
syhxj 2011-02-25
  • 打赏
  • 举报
回复
from auto_payment_due_t a inner join workload_t on a.policy_no = workload_t.policy_no
and a.deal_date between '01-01-2011' and '01-31-2011'
and a.payment_due_type in ('2','3','4','7')
inner join auto_agreement_t b on a.policy_no = b.policy_no
inner join motorised_vehicl01 c on a.policy_no = c.policy_no and b.policy_no = c.policy_no

把条件都放到连接语句里面去,这样会快点。
这样处理时可以理解为先根据某些条件取内容然后再连接,比如deal_date,payment_due_type,这样会先从a表中去符合这两个条件的数据然后再去连接
而原来的在where里的方式,是先整个连接出来一个总得结果集,然后再去找符合条件的
moonnylove 2011-02-25
  • 打赏
  • 举报
回复
3. 确定主表,将查询条件先加上,缩小查询范围。
moonnylove 2011-02-25
  • 打赏
  • 举报
回复
优化点: 1.建立索引。 2.采用join实现多表查询。 3. 确定主表,将查询条件先加上,查询数据量。


select a.branch_company_c01,a.policy_no,
a.endorsement_no,
a.product_code,a.department_code, date(a.deal_date),
a.amount,b.selling_channel_01,
c.vehicle_type,c.usage,workload_t.percent
from
(
select * from auto_payment_due_t
where date(deal_date) between '01-01-2011' and '01-31-2011'
and payment_due_type in ('2','3','4','7')
) a
inner join workload_t on a.policy_no = workload_t.policy_no,
inner join auto_agreement_t b on a.policy_no = b.policy_no
inner join motorised_vehicl01 c on a.policy_no = c.policy_no
Shawn 2011-02-24
  • 打赏
  • 举报
回复
--你的版本是2008?
--SQL SERVER 2005
SELECT
a.branch_company_c01,
a.policy_no,
a.endorsement_no,
a.product_code,
a.department_code,
deal_date = CONVERT(VARCHAR(10), a.deal_date, 120),
a.amount,
b.selling_channel_01,
c.vehicle_type,
c.usage,
w.[percent]
FROM auto_payment_due_t a
INNER JOIN workload_t w
ON a.policy_no = w.policy_no
INNER JOIN auto_agreement_t b
ON a.policy_no = b.policy_no
INNER JOIN motorised_vehicl01 c
ON a.policy_no = c.policy_no
WHERE a.deal_date BETWEEN '20110101' AND '20110131'
AND a.payment_due_type in ('2','3','4','7')

--a.deal_date 加索引
--a.payment_due_type 加索引
--a.policy_no, b.policy_no, c.policy_no 加索引(如果唯一可考虑聚集索引)
hb7817810 2011-02-24
  • 打赏
  • 举报
回复
必要条件里面就是date(deal_date) between '01-01-2011' and '01-31-2011'
和a.payment_due_type in ('2','3','4','7')
不用查询就不成立了。
Rotel-刘志东 2011-02-23
  • 打赏
  • 举报
回复
select a.branch_company_c01,a.policy_no,  
a.endorsement_no,
a.product_code,a.department_code, date(a.deal_date),
a.amount,b.selling_channel_01,
c.vehicle_type,c.usage,workload_t.percent
from auto_payment_due_t a
left join auto_agreement_t b on a.policy_no = b.policy_no
left join motorised_vehicl01 c on a.policy_no = c.policy_no
where date(deal_date) between '01-01-2011' and '01-31-2011'
and a.payment_due_type in ('2','3','4','7')
唵嘛呢叭咪吽 2011-02-23
  • 打赏
  • 举报
回复
每张表先用子查询 select 需要的字段 再 join
不要用between...and...
快溜 2011-02-23
  • 打赏
  • 举报
回复
 select a.branch_company_c01,a.policy_no,  
a.endorsement_no,
a.product_code,a.department_code, date(a.deal_date),
a.amount,b.selling_channel_01,
c.vehicle_type,c.usage,workload_t.percent
from auto_payment_due_t a
inner join workload_t on a.policy_no = workload_t.policy_no,
inner join auto_agreement_t b on a.policy_no = b.policy_no
inner join motorised_vehicl01 c on a.policy_no = c.policy_no
where date(deal_date) between '01-01-2011' and '01-31-2011'
and a.payment_due_type in ('2','3','4','7')

除了加索引,没有可以优化的了貌似。
gw6328 2011-02-23
  • 打赏
  • 举报
回复
这语句是mssql?
join 后面几个逗号怎么处理?
AcHerat 2011-02-23
  • 打赏
  • 举报
回复
date(deal_date) between '2011-01-01' and '2011-01-31'

相关字段建立索引!

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧