我正在设计一个包含两个父子关系表的模式。我关心的一个查询是子记录将根据父记录的两个字段中的值被重复查询。该用例涉及选择子记录,其中父记录中的一个字段等于 1,而另一个字段大于零。对于这个用例,不需要来自父记录的信息。
一个月的数据工作包含约 500,000 条父记录和约 1,500,000 条子记录。有问题的用例可能会返回 99% 的子记录。
有没有办法在基于父表中的标准字段的子表上设置索引?我已经考虑过一些非规范化并向子记录添加几个标准字段,但我犹豫不决。
我正在设计一个包含两个父子关系表的模式。我关心的一个查询是子记录将根据父记录的两个字段中的值被重复查询。该用例涉及选择子记录,其中父记录中的一个字段等于 1,而另一个字段大于零。对于这个用例,不需要来自父记录的信息。
一个月的数据工作包含约 500,000 条父记录和约 1,500,000 条子记录。有问题的用例可能会返回 99% 的子记录。
有没有办法在基于父表中的标准字段的子表上设置索引?我已经考虑过一些非规范化并向子记录添加几个标准字段,但我犹豫不决。
为此,听起来索引视图可以满足您的需求。
您将只能在子表的视图显示中包含列,同时加入父表以检查您需要的列 = 1。
解决方案的粗略示例可能如下所示:
CREATE VIEW dbo.vwChildTableRestrictedByParentValues
WITH SCHEMABINDING
AS
SELECT ct.col1, ct.col2, ct.etc
FROM dbo.ChildTable AS ct
INNER JOIN dbo.ParentTable AS pt ON ct.ParentId = pt.ParentId
WHERE pt.OneField = 1
AND pt.AnotherField > 0;
GO
CREATE CLUSTERED INDEX IX_vwChildTableRestrictedByParentValues
ON dbo.vwChildTableRestrictedByParentValues
(
Col1 ASC
, Col2 ASC
, etc ASC
)
索引包括要为子表编制索引的列。
如果您没有 Enterprise Edition,则必须针对视图编写查询。如果您有 Enterprise,则可以针对表编写查询,但仍使用您在此处创建的索引。