小编Kir*_*ers的帖子

将 VarChar(Max) [Notes] 列存储在同一个或单独的表中

免责声明

不久前我有一个桌子设计的想法,当时对我来说很有意义。在最近的历史中,我意识到我有“过度设计”或花费太多时间试图“过度优化”解决方案的习惯。我假设这是我过度考虑解决方案并且会产生额外开销而几乎没有实际收益的情况之一。

假设一个对象(Shipment table例如 a)有某种NOTE varchar(MAX)我们想要跟踪的数据元素。在NOTE column有机会具有推到溢流数据,并大幅提高的大小row(因此限制的数量rows可以保存上page)。据我了解,这会对整个表上的各种操作的执行时间产生负面影响。

是否曾经有过我们应该将其column单独放置ShipmentNote table而不是将其保留columnShipment table. 理论是,如果我们将 推NOTE column入一个单独的,table它会保存在pages上的Shipment table,从而使 上的所有操作Shipment table都能更好地执行。因为row尺寸更小,现在您可以rows在同一个page.

(请参阅下面的架构示例):

ER图

这可能是一个好主意的主要用例是:

  • Note column经常超过8000个字符(我认为这是当我们开始使用额外的分页)
  • Note column仅在返回SELECT操作,很少或从未使用的部分JOINWHERE
  • 其余columnsShipment将要查询的独立的Note一个定期(IE:我们大部分的操作,也就无法使用Note,是JOINWHERE …

database-design sql-server varchar

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

重用嵌套决策逻辑 - CTE 与复制代码

我有一个查询,它输出一个column,通过一系列CASE语句创建。这同样column被用作同一语句中CASE第二个逻辑的一部分。columnSELECT

如果我要构建一个CTE应用了内部逻辑的结构,那么当我必须将其用作以后的决定时,我可以参考内部逻辑。总的额外开销是多少?

据我了解,没有增加任何真正的开销。(下面是我使用的一些研究和一个简单的测试用例)。是否有文章讨论过这种情况或情况并非如此?


研究和简单的测试用例

我发现有几篇文章没有指出这个特定的问题,而是告诉我没有增加操作开销的方向。

我针对我们现有的一个数据库编写了一个小查询来测试这个理论。结果和执行时间相同,ThestatisticsQuery Execution Plan.

CodeExecution PlanStatistics对于非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)

performance sql-server cte query-performance

3
推荐指数
1
解决办法
102
查看次数

在同一个 SELECT 中使用右外连接和左外连接

我希望更好地建立我的 SQL 开发技能集。我目前工作的大部分数据都符合层次结构,我们几乎总是从最顶层的元素开始“向下”工作。这导致实际上只需要使用INNERLEFT OUTER连接各种查询。

我希望在我可能需要在同一个查询中使用 aRIGHT OUTERLEFT OUTERJOIN的情况下获得一些指导。

参考 StackOverflow 上的一个问题左联接、右联接、外联接和内联接有什么区别?我明白 aRIGHT OUTERLEFT OUTERJOIN 是什么,但是我被要求解决的所有问题都可以仅使用INNERLEFT OUTER连接来解决。

编辑:

我确实发现这基本上是之前 StackOverflow 问题的重复,何时或为什么使用右外连接而不是左连接?. 似乎普遍存在一种共识,即

  1. 大多数使用 a 的查询RIGHT OUTER JOIN都可以转换为 INNERandLEFT OUTER版本。
  2. 有用于读取能力,格式化或组织过程的一些好处,这可能需要使用RIGHT OUTER的替代LEFT OUTER

在该问题上还有一个答案,其中详细说明了您将INNER JOIN一组表放在一起的特定情况,然后RIGHT OUTER JOIN找到“正确”表在整个INNER JOIN'ed 子集中的记录位置。我认为这可以通过一个INNER JOINLEFT OUTER JOIN版本来完成,它只需要一些工作。

sql-server

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