【发布时间】:2024-04-25 04:40:02
【问题描述】:
我正在尝试将一些 C# 移植到 TSQL,因为性能不能令人满意。 C# 进行多个数据库调用。
这是用于住宿属性的刮板。架构如下:
刮擦
- ScrapeId
- fkProviderId
- fkLocation
- fkSessionId
- 开始
- 结束
ScrapeResults
- fkScrapeId
- 价格
- fkRoomId
本质上,这一切的重点是数据库跟踪内部房间价格与竞争对手附近的比较。 ScrapeResults 上的 fkRoomId 列唯一地定义了每个房间。每次抓取竞争对手时,Scrapes 表中都会有一个新条目,并且抓取的结果保存在 ScrapeResults 中。开始和结束日期为 1 周。刮擦每周价格为 3 个月。抓取每周发生一次,这是 fkSessionId 的目的,它与独特的抓取会话有关。
C# 代码构建的报告如下所示:
- 开始日期
- 结束日期
- 我们的房型
- 竞赛室1
- 竞赛室2
- ...
- 比赛室n
我不太确定是否可以为此构建 SQL 查询。我编写了一个构建动态 SQL 字符串的存储过程。这是我的第一次尝试:
select sr.ScrapeId,
sr.fkProviderId,
sr.startDate,
sr.endDate,
sr1.price,
sr2.price,
sr3.price,
sr4.price,
sr5.price,
sr6.price,
sr7.price,
sr8.price,
sr9.price,
sr10.price,
sr11.price,
sr12.price
from Scrapes sr
left join ScrapeResults sr1 on sr1.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr2 on sr2.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr3 on sr3.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr4 on sr4.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr5 on sr5.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr6 on sr6.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr7 on sr7.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr8 on sr8.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr9 on sr9.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr10 on sr10.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr11 on sr11.fkScrapeId = sr.ScrapeId
left join ScrapeResults sr12 on sr12.fkScrapeId = sr.ScrapeId
WHERE sr.fkSession = 25
and sr.startDate='2014-03-22'
and sr.fkLocationId = 1
and sr1.fkRoomId = 11
and sr2.fkRoomId = 15
and sr3.fkRoomId = 19
and sr4.fkRoomId = 23
and sr5.fkRoomId = 25
and sr6.fkRoomId = 27
and sr7.fkRoomId = 32
and sr8.fkRoomId = 39
and sr9.fkRoomId = 41
and sr10.fkRoomId = 45
and sr11.fkRoomId = 47
and sr12.fkRoomId = 50
我知道我在这里不合时宜,但希望得到指点。谢谢。
【问题讨论】:
-
您是从 LINQ 移植回 T-SQL 吗?您能否向我们展示您进行“多次数据库调用”的代码?我在处理具有许多连接甚至动态构造的查询的复杂查询方面拥有丰富的经验,它们的运行速度与存储过程一样快。我也许可以建议您如何改进现有代码而不是重写它
标签: sql sql-server performance tsql