2016-03-04 143 views
-1

我有一个报表,它是从我的数据仓库中的各种事实表填充的。问题是,对于该报表中的一位客户,需要46秒才能提取他的数据。该客户有4232424条记录。该表总共有5336393条记录,并且有4列。我将发布表结构和我正在运行的查询。我需要将结果时间降低到尽可能低。我试过在内存表中,各种索引和索引视图。在SQL Server 2014中的大表优化

表结构

CREATE TABLE cache.Tree 
(
CustomerID INT NOT NULL PRIMARY KEY NONCLUSTERED, 
RelationA_ID INT NOT NULL, 
RelationB_ID INT NOT NULL, 
NestedLevel INT NOT NULL, 
lft  INT NOT NULL, 
rgt  INT NOT NULL 
INDEX IX_LEGS CLUSTERED (lft, rgt), 
INDEX IX_LFT NONCLUSTERED (lft) 
) 

报表查询

SELECT 
tp.CustomerID AS DLine, 
t.CustomerID, 
t.RelationA_ID, 
Level = t.NestedLevel - tp.NestedLevel, 
IndentedSort = t.lft 
FROM cache.UnilevelTreeWithLC2 tp 
    INNER JOIN cache.UniLevelTreeWithLC2 t 
    ON t.lft between tp.lft AND tp.rgt 
    WHERE tp.CustomerID = 7664 

任何帮助或指导将不胜感激。

更新1:查询执行计划 Query Execution Plan

更新2:解决 我能获得许可,过滤掉在树上不活跃的人。如果我保留我放在桌面上的索引,这几乎将查询执行的一半削减了。

+0

请发布查询计划。我怀疑INDEX IX_LFT NONCLUSTERED(lft)没有被使用。但与其他两个指标应该涵盖联合和地点。你违反了指数? – Paparazzi

+1

您是否看过执行计划和统计数据?我建议使用这些统计数据:'SET STATISTICS IO ON'' 'SET STATISTICS TIME ON',只记得关闭它们。请使用这些工具来比较您的查询和索引更改,然后将问题与结果一起发布。 – jkdba

+0

我怀疑任何索引都会帮助这里说实话。你将返回530万行中的420万。这是表中总行数的80%。更大的问题是为什么你有一个显示420万行的报告? –

回答

1

尝试forcescan - 对于抽取80%窄表的查询,我希望SQL可以扫描,但它可能并不是因为错误的统计信息或各种基数估计错误之一(它们是固定的,但需要使用traceflags来启用) 。

我也会抛弃celko-sets - 一个parent_id col会使你的表更窄,这会加速这些吞吐量限制的情况,让你左/右维护,并且用递归查询非常快。