免责声明
不久前我有一个桌子设计的想法,当时对我来说很有意义。在最近的历史中,我意识到我有“过度设计”或花费太多时间试图“过度优化”解决方案的习惯。我假设这是我过度考虑解决方案并且会产生额外开销而几乎没有实际收益的情况之一。
题
假设一个对象(Shipment
table
例如 a)有某种NOTE
varchar(MAX)
我们想要跟踪的数据元素。在NOTE
column
有机会具有推到溢流数据,并大幅提高的大小row
(因此限制的数量rows
可以保存上page
)。据我了解,这会对整个表上的各种操作的执行时间产生负面影响。
是否曾经有过我们应该将其column
单独放置ShipmentNote
table
而不是将其保留column
在Shipment
table
. 理论是,如果我们将 推NOTE
column
入一个单独的,table
它会保存在pages
上的Shipment
table
,从而使 上的所有操作Shipment
table
都能更好地执行。因为row
尺寸更小,现在您可以rows
在同一个page
.
(请参阅下面的架构示例):
这可能是一个好主意的主要用例是:
Note
column
经常超过8000个字符(我认为这是当我们开始使用额外的分页)Note
column
仅在返回SELECT
操作,很少或从未使用的部分JOIN
或WHERE
columns
的Shipment
将要查询的独立的Note
一个定期(IE:我们大部分的操作,也就无法使用Note
,是JOIN
或WHERE …
题
我有一个查询,它输出一个column
,通过一系列CASE
语句创建。这同样column
被用作同一语句中CASE
第二个逻辑的一部分。column
SELECT
如果我要构建一个CTE
应用了内部逻辑的结构,那么当我必须将其用作以后的决定时,我可以参考内部逻辑。总的额外开销是多少?
据我了解,没有增加任何真正的开销。(下面是我使用的一些研究和一个简单的测试用例)。是否有文章讨论过这种情况或情况并非如此?
研究和简单的测试用例
我发现有几篇文章没有指出这个特定的问题,而是告诉我没有增加操作开销的方向。
我针对我们现有的一个数据库编写了一个小查询来测试这个理论。结果和执行时间相同,Thestatistics
和Query Execution Plan
.
Code
,Execution Plan
而Statistics
对于非CTE
版本:
SELECT PC.CompanyID,
PC.ClientID,
PC.ProgramID,
PC.PatientID,
PC.CaseID,
CASE
WHEN PFH.FulFilHdrCreateDateTime IS NULL
THEN PC.CaseCreateDateTime
ELSE
PFH.FulFilHdrCreateDateTime
END AS [ImportantDate],
DATEDIFF(Day, CASE WHEN PFH.FulFilHdrCreateDateTime IS NULL THEN PC.CaseCreateDateTime ELSE PFH.FulFilHdrCreateDateTime END, GETDATE())
FROM PATIENTCASES PC
LEFT OUTER JOIN PATFULFILLMENTHEADER PFH
ON PFH.CompanyID = PC.CompanyID
AND …
Run Code Online (Sandbox Code Playgroud) 我希望更好地建立我的 SQL 开发技能集。我目前工作的大部分数据都符合层次结构,我们几乎总是从最顶层的元素开始“向下”工作。这导致实际上只需要使用INNER
和LEFT OUTER
连接各种查询。
我希望在我可能需要在同一个查询中使用 aRIGHT OUTER
和LEFT OUTER
JOIN的情况下获得一些指导。
参考 StackOverflow 上的一个问题左联接、右联接、外联接和内联接有什么区别?我明白 aRIGHT OUTER
和LEFT OUTER
JOIN 是什么,但是我被要求解决的所有问题都可以仅使用INNER
和LEFT OUTER
连接来解决。
编辑:
我确实发现这基本上是之前 StackOverflow 问题的重复,何时或为什么使用右外连接而不是左连接?. 似乎普遍存在一种共识,即
RIGHT OUTER JOIN
都可以转换为
INNER
andLEFT OUTER
版本。RIGHT OUTER
的替代LEFT OUTER
。在该问题上还有一个答案,其中详细说明了您将INNER JOIN
一组表放在一起的特定情况,然后RIGHT OUTER JOIN
找到“正确”表在整个INNER JOIN
'ed 子集中的记录位置。我认为这可以通过一个INNER JOIN
和LEFT OUTER JOIN
版本来完成,它只需要一些工作。