相关疑难解决方法(0)

CTE和SubQuery之间的区别?

从这篇文章如何在以下过程中使用ROW_NUMBER?

有两个版本的答案,其中一个使用a SubQuery,另一个使用a CTE来解决相同的问题.

那么,使用CTE (Common Table Expression)over as 的优点是什么ub-query(因此,查询实际上更具可读性)

使用CTEover sub select 的唯一优点是我可以实际命名子查询.当CTE用作简单(非递归)CTE时,这两者之间是否存在其他差异

sql t-sql sql-server subquery common-table-expression

135
推荐指数
7
解决办法
7万
查看次数

为什么临时表和子选择之间存在巨大的性能差异

这是一个关于SQL Server 2008 R2的问题

到目前为止,我不是DBA.我是一名java开发人员,必须不时编写SQL.(主要嵌入代码中).我想知道我在这里做错了什么,如果是的话,我可以做些什么来避免它再次发生.

Q1:

SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Run Code Online (Sandbox Code Playgroud)

Q1有14个连接

Q2与Q1相同,但有一个例外.(SELECT*FROM T1 WHERE condition1)之前执行,并存储在临时表中.

这不是相关的子查询.

Q2:

SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable  JOIN ...
Run Code Online (Sandbox Code Playgroud)

再次,14加入.

现在让我感到困惑的是,Q1花了> 2分钟(尝试了几次,以避免缓存发挥作用),而Q2(两个查询合并)花了2秒!是什么赋予了?

sql sql-server-2008-r2 query-performance

36
推荐指数
2
解决办法
6万
查看次数

避免重复引用多个连接表的子查询

我有一个子查询(LastActivityOn),我想在三个地方使用,我的投影(SELECTed输出),ORDER BY和WHERE子句.

SELECT TOP 175
  (SELECT MAX(ActivityDate) FROM (VALUES
    (UserRegistration.CreatedOn),
    (UserRegistration.ActivatedOn),
    (UserRegistration.LastLoginOn),
    (UserRegistration.UpdatedOn),
    (UserProfile.LastPostedOn)) AS AllDates(ActivityDate)) LastActivityOn,
  UserRegistration.FirstName,
  UserRegistration.LastName,
  [15 more columns of various calculated distances, coalesces, etc...]
FROM
  UserRegistration
  INNER JOIN UserProfile ON UserRegistration.Id = UserProfile.RegistrationId
  INNER JOIN (
    SELECT PostalCode, GeoCenter, PrimaryCity, StateOrProvince
    FROM PostalCodes 
    WHERE @OriginPostalCode IS NULL OR PostalCodes.GeoCenter.STDistance(@OriginPoint) < @WithinMeters
  ) AS ProximalPostalCodes ON ProximalPostalCodes.PostalCode = UserRegistration.PostalCode
  [7 more joins including full-text queries]
WHERE
  LastActivityOn > @OldestUserToSearch AND
  [20 more lines of filtering …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

4
推荐指数
1
解决办法
4212
查看次数

是否应该用临时表替换所有子查询?

我一直在研究一种解决方案(在SQL Server中),其中所有没有异常的子查询都已使用临时表重写,以提高性能.

举个例子,所有的查询都是这样的:

SELECT something 
FROM (SELECT * FROM T1 WHERE condition1) 
JOIN ...
Run Code Online (Sandbox Code Playgroud)

被重写为这样:

SELECT * 
INTO #tempTable 
FROM T1 
WHERE condition1

SELECT something 
FROM #tempTable  
JOIN ...
Run Code Online (Sandbox Code Playgroud)

这里还建议所有子查询都应该避免使用临时表.

基于给定的事实,是否应该用临时表替换所有子查询?如果不是什么时候应该考虑另一个?

sql sql-server query-performance

2
推荐指数
1
解决办法
2793
查看次数