求优化sql 效率 (DBA_Huangzj来活了 )

码畜二代 2014-02-27 01:30:42


这个是view的sql
SELECT     SUM(CONVERT(money, yavg)) / SUM(CONVERT(int, DAYS)) AS yavg, FproductID, NF, FproductName, MarketID
FROM (SELECT SUBSTRING(CONVERT(varchar(10), DATEADD(ms, - 3, DATEADD(mm, DATEDIFF(m, 0, GetDate) + 1, 0)), 20), 9, 9) AS DAYS,
SUBSTRING(CONVERT(varchar(10), DATEADD(ms, - 3, DATEADD(mm, DATEDIFF(m, 0, GetDate) + 1, 0)), 20), 9, 9) * yuejunjia AS yavg,
SUBSTRING(CONVERT(varchar(10), DATEADD(ms, - 3, DATEADD(mm, DATEDIFF(m, 0, GetDate) + 1, 0)), 20), 1, 4) AS NF, FproductID,
FproductName, MarketID
FROM (SELECT DISTINCT c.FproductName, b.GetDate, b.yuehuanbi, b.yuetongbi, b.yuejunjia, b.FproductID, b.MarketID
FROM dbo.ls_scb AS a INNER JOIN
dbo.ls_jgb AS b ON a.MarketID = b.MarketID INNER JOIN
dbo.ls_pzb AS c ON b.FproductID = c.FproductID) AS s) AS a
GROUP BY FproductID, NF, FproductName, MarketID


另外一个view 套上面一个视图
SELECT     v1.NF, CAST(v1.yavg AS numeric(16, 2)) AS yavg, v1.FproductID, CAST((v1.yavg - v2.yavg) / v2.yavg * 100 AS numeric(16, 2)) AS yhb, v1.FproductName,
v1.marketid
FROM dbo.v_alllsyear_avg AS v1 LEFT OUTER JOIN
dbo.v_alllsyear_avg AS v2 ON v1.NF = v2.NF + 1 AND v1.FproductID = v2.FproductID AND v1.marketid = v2.marketid



这个是执行的sql 执行完15秒
 sELECT  *
FROM
ls_scb AS a
inner JOIN ls_jgb AS b ON a.MarketID = b.MarketID
inner JOIN ls_pzb AS c ON b.FproductID = c.FproductID
left join v_alllsyear_hb v on v.fproductid=b.fproductid and v.nf=substring(convert(varchar(10),b.getdate),7,9) and v.marketid=b.marketid



...全文
284 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
俩人隔空对话 鄙人佩服至极
Q315054403 2014-02-28
  • 打赏
  • 举报
回复
这样的优化,多数要从数据结构甚至业务流程上着手,单纯的改写下SQL不见得能有多大性能提升。。接手的案例符合这个规律
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
引用 16 楼 u010615963 的回复:
引用 15 楼 DBA_Huangzj 的回复:
不要用我发给你的,就用你加了where条件的那个
嗯,可以了。一个是没索引
现在什么情况?
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
不要用我发给你的,就用你加了where条件的那个
嗯,可以了。一个是没索引
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
不要用我发给你的,就用你加了where条件的那个
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
还是报前面那个错
引用 13 楼 DBA_Huangzj 的回复:
再执行你的原来的语句,不要用我发给你的 [quote=引用 12 楼 u010615963 的回复:] [quote=引用 11 楼 DBA_Huangzj 的回复:] 执行一下:

USE 库名
GO
CREATE NONCLUSTERED INDEX NONCLUSTERED_INDEX_ls_jgb
ON [dbo].[ls_jgb] ([MarketID],[FproductID])
INCLUDE ([GetDate],[yuetongbi],[yuehuanbi],[yuejunjia])
GO
执行后呢个[/quote][/quote]
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
再执行你的原来的语句,不要用我发给你的
引用 12 楼 u010615963 的回复:
[quote=引用 11 楼 DBA_Huangzj 的回复:] 执行一下:

USE 库名
GO
CREATE NONCLUSTERED INDEX NONCLUSTERED_INDEX_ls_jgb
ON [dbo].[ls_jgb] ([MarketID],[FproductID])
INCLUDE ([GetDate],[yuetongbi],[yuehuanbi],[yuejunjia])
GO
执行后呢个[/quote]
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
执行一下:

USE 库名
GO
CREATE NONCLUSTERED INDEX NONCLUSTERED_INDEX_ls_jgb
ON [dbo].[ls_jgb] ([MarketID],[FproductID])
INCLUDE ([GetDate],[yuetongbi],[yuehuanbi],[yuejunjia])
GO
执行后呢个
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
执行一下:

USE 库名
GO
CREATE NONCLUSTERED INDEX NONCLUSTERED_INDEX_ls_jgb
ON [dbo].[ls_jgb] ([MarketID],[FproductID])
INCLUDE ([GetDate],[yuetongbi],[yuehuanbi],[yuejunjia])
GO
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
你换我私信的写法试试
]由于此查询中定义了提示,查询处理器未能生成查询计划。请重新提交查询,并且不要在查询中指定任何提示,也不要使用 SET FORCEPLAN。
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
你换我私信的写法试试
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
看手机和私信。
什么意思 你刚刚说
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
看手机和私信。
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
15秒查出来的是20万
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
我说结果集:
码畜二代 2014-02-27
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
600万的数据,没有where条件,15秒貌似挺优秀的....
20万的
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
600万的数据,没有where条件,15秒貌似挺优秀的....
直面人生 2014-02-27
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
执行计划上一下
来活了
發糞塗牆 2014-02-27
  • 打赏
  • 举报
回复
执行计划上一下

22,209

社区成员

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

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