如果让强制视图计算(查询提示)

artmouse 2011-01-24 05:27:24
问题代码大概如下,简化了很多东西。

以下语句需要2000多毫秒
;WITH Temp AS
(
SELECT a.SecId,
a.AsOfDate
FROM CurrentData.dbo.vw_SettingAggregateId a
GROUP BY a.SecId,a.AsOfDate
)
SELECT a.SecId,
a.AsOfDate,
b.ComponentSecId
FROM Temp a
LEFT OUTER JOIN CurrentData.dbo.vw_SettingAggregateId b
ON a.SecId=b.SecId
AND a.AsOfDate=b.AsOfDate

其中CurrentData.dbo.vw_SettingAggregateId 是一个复杂的视图,但是查询只需要28毫秒
SELECT * FROM CurrentData.dbo.vw_SettingAggregateId

经过查询优化器优化后,查询优化器选择了一个效率很低的查询计划,我想请问有没有办法强制CurrentData.dbo.vw_SettingAggregateId 先执行,就是相当于先将CurrentData.dbo.vw_SettingAggregateId的东西放到临时表。

总的来说,应该要用到查询暗示,but 我不知道怎么用

...全文
96 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
artmouse 2011-01-24
  • 打赏
  • 举报
回复
最后大概是这样,
SELECT a.SecId,
a.AsOfDate,
a.ComponentSecId,
MIN( CASE WHEN CurrentData.dbo.fn_getFixedDate(a.AsOfDate)<b.EndDate
THEN EndDate
ELSE CurrentData.dbo.fn_getFixedDate(a.AsOfDate) END) OVER() AS EndDate
FROM CurrentData.dbo.vw_SettingAggregateId a
LEFT OUTER JOIN TimeSeries.dbo.vw_CashFlowRaw b
ON a.ComponentSecId=b.SecId
AND a.AsOfDate=b.AsOfDate
AND b.EndDateRN=1

SQL是个博大精深的东西,性能优化实属不易啊,view写的很复杂是因为里面的逻辑真的很复杂,经过优化是100MS完成。
这个项目是一些证券指标的计算,外面的软件是2小时算一个数据,我打算是1秒一个。
叶子 2011-01-24
  • 打赏
  • 举报
回复
视图数据是从表里出来的,考虑能否优化表结构,或是表的索引等。
Shawn 2011-01-24
  • 打赏
  • 举报
回复
--#1.你用LEFT JOIN后的结果,不是和 select * from CurrentData.dbo.vw_SettingAggregateId 查询出来的记录条数是一样的吗?
--如果每个组中只取一条的话,在下面的语句中用top(1)即可。
--#2.试一下下面SQL的效率
;WITH Temp AS
(
select * from CurrentData.dbo.vw_SettingAggregateId
)
select a.SecId, a.AsOfDate, b.ComponentSecId from
(SELECT a.SecId, a.AsOfDate FROM Temp a GROUP BY a.SecId,a.AsOfDate) a
outer apply
(select /*top(1)*/* from Temp where SecId=a.SecId and AsOfDate=a.AsOfDate) b
artmouse 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dawugui 的回复:]
这样即可.


SQL code
SELECT a.SecId,
a.AsOfDate,
b.ComponentSecId
FROM
(
SELECT a.SecId,
a.AsOfDate
FROM CurrentData.dbo.vw_SettingAggregateId a
GROUP BY a.SecId,a.AsOfDate
) a
LEF……
[/Quote]
这样是不行的,2种写法没区别,应该是完全等价语法
dawugui 2011-01-24
  • 打赏
  • 举报
回复
不过,你这个视图有啥用处?没看出来.

SELECT a.SecId,
a.AsOfDate
FROM CurrentData.dbo.vw_SettingAggregateId a
GROUP BY a.SecId,a.AsOfDate
dawugui 2011-01-24
  • 打赏
  • 举报
回复
这样即可.

SELECT a.SecId,
a.AsOfDate,
b.ComponentSecId
FROM
(
SELECT a.SecId,
a.AsOfDate
FROM CurrentData.dbo.vw_SettingAggregateId a
GROUP BY a.SecId,a.AsOfDate
) a
LEFT OUTER JOIN CurrentData.dbo.vw_SettingAggregateId b
ON a.SecId=b.SecId
AND a.AsOfDate=b.AsOfDate
快溜 2011-01-24
  • 打赏
  • 举报
回复
你把一张视图做外连接干什么?

22,302

社区成员

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

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