-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
任何帮助或指导将不胜感激。
更新2:解决 我能获得许可,过滤掉在树上不活跃的人。如果我保留我放在桌面上的索引,这几乎将查询执行的一半削减了。
请发布查询计划。我怀疑INDEX IX_LFT NONCLUSTERED(lft)没有被使用。但与其他两个指标应该涵盖联合和地点。你违反了指数? – Paparazzi
您是否看过执行计划和统计数据?我建议使用这些统计数据:'SET STATISTICS IO ON'' 'SET STATISTICS TIME ON',只记得关闭它们。请使用这些工具来比较您的查询和索引更改,然后将问题与结果一起发布。 – jkdba
我怀疑任何索引都会帮助这里说实话。你将返回530万行中的420万。这是表中总行数的80%。更大的问题是为什么你有一个显示420万行的报告? –