免责声明
不久前我有一个桌子设计的想法,当时对我来说很有意义。在最近的历史中,我意识到我有“过度设计”或花费太多时间试图“过度优化”解决方案的习惯。我假设这是我过度考虑解决方案并且会产生额外开销而几乎没有实际收益的情况之一。
题
假设一个对象(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或WHEREcolumns的Shipment将要查询的独立的Note一个定期(IE:我们大部分的操作,也就无法使用Note,是JOIN或WHERE …题
我有一个查询,它输出一个column,通过一系列CASE语句创建。这同样column被用作同一语句中CASE第二个逻辑的一部分。columnSELECT
如果我要构建一个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 OUTERJOIN的情况下获得一些指导。
参考 StackOverflow 上的一个问题左联接、右联接、外联接和内联接有什么区别?我明白 aRIGHT OUTER和LEFT OUTERJOIN 是什么,但是我被要求解决的所有问题都可以仅使用INNER和LEFT OUTER连接来解决。
编辑:
我确实发现这基本上是之前 StackOverflow 问题的重复,何时或为什么使用右外连接而不是左连接?. 似乎普遍存在一种共识,即
RIGHT OUTER JOIN都可以转换为
INNERandLEFT OUTER版本。RIGHT OUTER的替代LEFT OUTER。在该问题上还有一个答案,其中详细说明了您将INNER JOIN一组表放在一起的特定情况,然后RIGHT OUTER JOIN找到“正确”表在整个INNER JOIN'ed 子集中的记录位置。我认为这可以通过一个INNER JOIN和LEFT OUTER JOIN版本来完成,它只需要一些工作。