我有一个相对简单的查询连接两个表."Where"标准可以在连接标准中表示,也可以表示为where子句.我想知道哪个更有效率.
查询是从一开始就查找推销员的最大销售额.
情况1
select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales on salesman.salesmanid =sales.salesmanid
and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
Run Code Online (Sandbox Code Playgroud)
案例2
select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales on salesman.salesmanid =sales.salesmanid
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
Run Code Online (Sandbox Code Playgroud)
注意案例1完全没有where子句
RDBMS是Sql Server 2005
编辑 如果第二部分连接条件或where子句是sales.salesdate <某个固定日期,那么它实际上没有任何加入这两个表的条件会改变答案.
我有一个复杂的查询,我需要在后续查询(实际更新语句)中使用.我尝试过使用CTE和临时表.使用CTE的性能与临时表方法相比非常糟糕.它像15秒对毫秒.为了简化测试而不是在后续查询中加入CTE/Temp表,我只是从中选择了*.在那种情况下,他们执行相同的操作
我已经查看了两种方法的执行计划,这两种方法都使用了后续查询中的连接,然后只需选择*.与简单选择查询计划大致相同,但在后续选择连接时查询计划不是.具体来说,用于创建和填充临时表的查询计划部分保持不变,而用于创建和填充CTE的查询计划部分随后在具有连接的查询中使用时会发生显着变化.
我的问题是为什么CTE的创建和填充的查询计划根据临时表的后续使用方式而改变.同样在什么情况下,CTE会比临时表产生更好的性能?
*注意我也使用了表变量,它与临时表方法相当.
谢谢
sql t-sql sql-server sql-server-2005 common-table-expression
此查询的目的是恢复销售产品的产品及其价格,价格应该从最接近但不等于传递日期的日期开始,基本上是最近可用的价格.每天都没有价格记录.在where子句中使用聚合select语句有点不对劲.有一个更好的方法吗?也许在加入标准?
select
p.ProductName,
pp.Price,
pp.Date,
from product p
inner join productprice pp on p.productid = pp.productid
where
pp.evaluationdate = (select max(Date) from productprice
where productid = p.productid
and date < @DateIn)
and p.producttype = 'OnSale'
Run Code Online (Sandbox Code Playgroud)
实际的查询有点复杂,但这基本上是问题所在.感谢您的输入.
编辑 将返回多个产品
编辑 我正在试验@Remus Rusanu和@ km的建议(虽然@Remus Rusanu删除了他的)三个,包括我原来的,在性能方面似乎差不多.我试图决定一个人是否以其他一些无形的方式提供优惠,即维护,自我记录等,因为这将由其他人维持.再次感谢.
有没有人知道一个实现到期收益率和其他固定收益计算的开源金融图书馆?该库需要从.Net调用.
sql ×3
sql-server ×3
c# ×2
t-sql ×2
.net ×1
financial ×1
join ×1
nlog ×1
where-clause ×1
yield ×1