Sql 使用同一中间标注的多个参照标注

Sql 使用同一中间标注的多个参照标注,sql,sql-server-2008-r2,ssas,olap,dimension,Sql,Sql Server 2008 R2,Ssas,Olap,Dimension,SQL Server 2008 R2 我有一个链接到维度的事实表。该维度有多个日期ID,用于不同的日期、开始、结束等。因此,在维度使用屏幕中,有与度量值组链接的日期维度的各种化身,作为参考维度 似乎生成用于填充度量值组的SQL多次链接到维度表,这大大降低了速度。实际上有6个连接,根据执行计划,每个连接都是总成本的14%,因此如果我能阻止它这样做,我估计它将以当前成本的30%左右执行 事实表实际上是一个视图,因此我可以将日期id添加到视图中,并将维度设置为常规关系 有没有更干净的方法来强制使用更高

SQL Server 2008 R2

我有一个链接到维度的事实表。该维度有多个日期ID,用于不同的日期、开始、结束等。因此,在维度使用屏幕中,有与度量值组链接的日期维度的各种化身,作为参考维度

似乎生成用于填充度量值组的SQL多次链接到维度表,这大大降低了速度。实际上有6个连接,根据执行计划,每个连接都是总成本的14%,因此如果我能阻止它这样做,我估计它将以当前成本的30%左右执行

事实表实际上是一个视图,因此我可以将日期id添加到视图中,并将维度设置为常规关系

有没有更干净的方法来强制使用更高效的SQL

以下三个表格可用于说明该问题:

CREATE TABLE dbo.FactTable
(
Fact1 numeric(16, 2) NOT NULL,
ForeignKey1 int NOT NULL
)  ON [PRIMARY]
GO

CREATE TABLE dbo.IntermediateDimension
(
[Key]    int NOT NULL,
DateId1 int not null,
DateId2 int not null,
DateId3 int not null,
DateId4 int not null,
DateId5 int not null,
DateId6 int not null,
Attr1 nvarchar(30),
Attr2 nvarchar(30)
) on [PRIMARY]  
GO

CREATE TABLE dbo.DateDimension
(
[Key]    int NOT NULL,
[Date] datetime not null
) on [PRIMARY]   
GO
事实表链接到中间维度以检索日期id。
从表DateDimension在多维数据集中创建6个维度。这些标注通过中间标注作为参照标注链接

处理多维数据集时,将运行以下SQL:-

SELECT 
[dbo_FactTable].[Fact1] AS [dbo_FactTableFact10_0],
[dbo_FactTable].[ForeignKey1] AS [dbo_FactTableForeignKey10_1],
[dbo_IntermediateDimension_2].[DateId1] AS [dbo_IntermediateDimensionDateId17_0],
[dbo_IntermediateDimension_3].[DateId2] AS [dbo_IntermediateDimensionDateId29_0],
[dbo_IntermediateDimension_4].[DateId3] AS [dbo_IntermediateDimensionDateId311_0],
[dbo_IntermediateDimension_5].[DateId4] AS [dbo_IntermediateDimensionDateId413_0],
[dbo_IntermediateDimension_6].[DateId5] AS [dbo_IntermediateDimensionDateId515_0],
[dbo_IntermediateDimension_7].[DateId6] AS [dbo_IntermediateDimensionDateId617_0]
FROM 
[dbo].[FactTable] AS [dbo_FactTable],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_2],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_3],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_4],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_5],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_6],
[dbo].[IntermediateDimension] AS [dbo_IntermediateDimension_7]
WHERE    (       (    
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_2].[Key]   )  AND     (    
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_3].[Key]   )      AND     (   
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_4].[Key]   )      AND     (    
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_5].[Key]   )      AND     (    
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_6].[Key]   )      AND     (    
[dbo_FactTable].[ForeignKey1]   =  [dbo_IntermediateDimension_7].[Key]   )     )

您可以看到它链接到同一行6次,以获取每个日期id。它不需要这样做。

如果你把它做成一个合适的立方体(SSAS)——我认为这是因为你使用了“事实表”和“维度”——那就没关系了。如果将日期添加到视图中,仍然需要查找它们。知道这是否有帮助的唯一方法是去做;还可以查看正在使用的任何索引-如果可能,日期维度的查找应该通过索引进行。Simon,谢谢你的输入,但我不明白。它是一个合适的SSAS立方体。帮我理解你的意思,为什么它不是一个“合适的”立方体?是的,它们仍然需要被查找,但是它们都可以来自同一维度行。事实并非如此。对同一中间维度行的六个查找以及对日期维度的查找都使用集群主键和代理项id。当您谈论连接时,我假设您谈论的是您所询问的数据库。看起来您是在询问源数据库,而不是多维数据集本身?换句话说,您是在询问从源数据库更新多维数据集所需的时间吗?是的。针对我的仓库的运行,我认为是由SSAS(我知道我没有编写它!)生成的,用于填充OLAP数据库上的度量值组,它被标记为我最昂贵的查询之一,并且它以84%的批处理成本进行了6次相同的连接。希望你能明白为什么我想把它简化为一个连接!