sql执行效率

webjock 2020-11-04 12:16:04

--客户表
create table TB_Customer
(
ID int identity primary key,
Name nvarchar(10),
Mobile nvarchar(10)
)
--销售单表
create table TB_Sale
(
ID int identity primary key,
Year int,--年份
CustomerID int,--客户表外键
IsCard bit default(0),--有卡片销售
IsProduct bit default(0),--有零售
SalePrice decimal(10,2)--销售额
)
--卡片表
create table TB_Card
(
ID int identity primary key,
Year int,--年份
Statu int, --1、不可以2、可用3、已用
CardNumber nvarchar(20),
CardPrice int,--卡片额度
BuyDiscount decimal(3,2),--购买折扣
CustomerID int,--客户表外键
SaleID int,--销售单表外键
)

上述三张表,其中客户表的数据10W,销售单表的数据30W,卡片表的数据500W
目前需要汇总几个数据:
1、查询所有客户的购买额度和卡片的购买额度
2、查询销售单中不同状态卡片的集合
上边2个方法,我用的是基本的查询汇总方式

--查询所有客户的购买额度和卡片的购买额度
select c.ID,C.Name,c.Mobile,
(select ISNULL(sum(s.SalePrice),0) from TB_Sale s where s.CustomerID=c.ID) as 'SalePrice',
(select ISNULL(sum(case when d.BuyDiscount>0 d.CardPrice*d.BuyDiscount then else d.CardPrice end),0) from TB_Card d where d.CustomerID=c.ID) as 'CardPrice'
from TB_Customer c

--查询销售单中不同状态卡片的集合
select * from TB_Card where Statu=1 and SaleID=@SaleID
select * from TB_Card where Statu=2 and SaleID=@SaleID
select * from TB_Card where Statu=3 and SaleID=@SaleID

我用的方法执行起来比较慢,其中我对TB_Sale中的CustomerID,TB_Card中的Statu、CustomerID、SaleID加了索引。
上述方法执行起来比较耗CPU,执行时间也特别慢,应该怎样提高查询速度和性能,需不需要做分区什么的
...全文
187 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2020-11-05
  • 打赏
  • 举报
回复
提几点: 1,subselect的效率没有join高,可以将sub select改写成join 2,数据没有有效标签,这个对于性能有很大影响 3,你将card和customer作为主表选取数据,但是恰恰这两个表没有index,效率不高。
webjock 2020-11-05
  • 打赏
  • 举报
回复
引用 5 楼 shoppo0505 的回复:
提几点: 1,subselect的效率没有join高,可以将sub select改写成join 2,数据没有有效标签,这个对于性能有很大影响 3,你将card和customer作为主表选取数据,但是恰恰这两个表没有index,效率不高。
你说的第一条我没太懂,这个汇总的结果集在一个列上的怎么改成join,还有第三条我也没看明白其中的意思。
lao_yunger 2020-11-04
  • 打赏
  • 举报
回复
最理想的方法是按年份分区,可以参考SQL SERVER HELP菜单; 没有哪个客户厉害到要把几十万个数据一条一条看过的,
chengangcsdn 2020-11-04
  • 打赏
  • 举报
回复
查集合的那三个语句 建一个 SaleID, Statu 两个字段的联合索引。速度应该非常快。 另外。不要一次返回客户端那么多数据,使用分页返回
chengangcsdn 2020-11-04
  • 打赏
  • 举报
回复
用left join 写吧。 TB_Sale 的CustomerID字段加索引 TB_Card的 CustomerID字段也要加索引
吉普赛的歌 2020-11-04
  • 打赏
  • 举报
回复
客户有10万,你要一口气查10万条信息, 即使不关联其它表, 也快不到哪里吧?

索引是在筛选,保留少部分记录的条件下才有效的, 你全部查, 索引有何意义?

建议:
1. 以空间换时间, 在客户表中增加字段, 保存相应的值, 在购买时就更新这些值, 不要等查询时再来慢慢算。
2. 如果是网站或其他客户端访问,增加分页,每页20条数据即可

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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