Sql 关于多键表的CTE索引建议

Sql 关于多键表的CTE索引建议,sql,sql-server,sql-server-2008-r2,common-table-expression,Sql,Sql Server,Sql Server 2008 R2,Common Table Expression,我有一个在ChargeID和CustomerID上键入的视图(费用可以在多个客户之间分摊)。该视图由2个表组成(此处高度简化,实际表中每个表约有40列): 视图只是将这两者连接在一起: CREATE VIEW vwBASEChargeChargeShareCustomer AS Select ParentChargeID, b.* from tblCharge a inner join tblChargeShare b on a.ChargeID = b.ChargeID 然后,我有一个CTE

我有一个在ChargeID和CustomerID上键入的视图(费用可以在多个客户之间分摊)。该视图由2个表组成(此处高度简化,实际表中每个表约有40列):

视图只是将这两者连接在一起:

CREATE VIEW vwBASEChargeChargeShareCustomer AS
Select ParentChargeID, b.* from tblCharge a inner join tblChargeShare b on a.ChargeID = b.ChargeID
然后,我有一个CTE,用于获取家长的次级费用:

WITH RCTE AS
(
SELECT  ParentChargeId, ChargeID, 1 AS Lvl, ISNULL(TotalAmount, 0) as TotalAmount,  ISNULL(TaxAmount, 0) as TaxAmount,  
ISNULL(DiscountAmount, 0) as DiscountAmount, CustomerID, ChargeID as MasterChargeID
FROM vwBASEChargeChargeShareCustomer Where ParentChargeID is NULL

UNION ALL

SELECT rh.ParentChargeID, rh.ChargeID, Lvl+1 AS Lvl, ISNULL(rh.TotalAmount, 0),  ISNULL(rh.TaxAmount, 0),  ISNULL(rh.DiscountAmount, 0) , rh.CustomerID 
, rc.MasterChargeID 
FROM vwBASEChargeChargeShareCustomer rh
INNER JOIN RCTE rc ON rh.PArentChargeID = rc.ChargeID and rh.CustomerID = rc.CustomerID )

Select MasterChargeID, CustomerID, ParentChargeID, ChargeID, TotalAmount, TaxAmount, DiscountAmount , Lvl
FROM  RCTE r 
因此,CTE在CustomerID和ChargeID=ParentChargeID上加入

这很有效,但在大型数据集(数百万的费用)上表现不佳


索引表(或视图)以获得最佳性能的最佳方法是什么?(SQL 2008R2及更高版本)

到目前为止,您尝试了什么?显然,您已经尝试在ChargeID和CustomerID上创建索引,但您对性能不满意?您尝试运行执行计划了吗?抱歉,是的,我在表上对tblCharge.ChargeID、tblCharge.ParentChargeID、tblChargeShare.ChargeID和tblChargeShare.CustomerID有单独的索引。表聚集在哪些列上?tblCharge.ChargeID和tblChargeShare.ChargeShareID
WITH RCTE AS
(
SELECT  ParentChargeId, ChargeID, 1 AS Lvl, ISNULL(TotalAmount, 0) as TotalAmount,  ISNULL(TaxAmount, 0) as TaxAmount,  
ISNULL(DiscountAmount, 0) as DiscountAmount, CustomerID, ChargeID as MasterChargeID
FROM vwBASEChargeChargeShareCustomer Where ParentChargeID is NULL

UNION ALL

SELECT rh.ParentChargeID, rh.ChargeID, Lvl+1 AS Lvl, ISNULL(rh.TotalAmount, 0),  ISNULL(rh.TaxAmount, 0),  ISNULL(rh.DiscountAmount, 0) , rh.CustomerID 
, rc.MasterChargeID 
FROM vwBASEChargeChargeShareCustomer rh
INNER JOIN RCTE rc ON rh.PArentChargeID = rc.ChargeID and rh.CustomerID = rc.CustomerID )

Select MasterChargeID, CustomerID, ParentChargeID, ChargeID, TotalAmount, TaxAmount, DiscountAmount , Lvl
FROM  RCTE r