我们有一个4-5TB的SQL Server数据库。最大的表大约有800 GB大,包含1亿行。4-5其他可比表格是这一大小的1/3-2/3。我们经历了一个创建新索引以优化性能的过程。虽然性能确实有所提高,但我们看到,新插入的数据查询速度最慢。
这是一个财务报告应用程序,使用BI工具在数据库上工作。数据在一夜之间继续加载,但大部分数据在早上7点加载。用户开始在早上8点左右通过BI工具查询数据,并且最关心的是最新的(每日)数据。
我想知道新插入的数据是否会导致索引出现故障。我们能做些什么使我们在新插入的数据上获得比旧数据更好的性能呢?我希望我在这里已经很好地解释了这个问题。如果有任何信息丢失,请告诉我。谢谢
编辑1
让我来描述一下建筑。我有一个基表(让我们称它为Base),其中包含日期,id作为聚集索引。它有大约50列,然后根据不同的度量类型,我们有5个派生表(Derived1、Derived2、.),其中也有日期、Id作为聚集索引和基表上的外键约束。
表Derived1和Derived2有350+列。衍生3,4,5有大约100-200列。创建了一个大视图来连接所有数据表,这是BI工具的适当限制。日期、ID是连接所有表以形成视图的连接列(因此,我在这些列上创建了聚集索引)。主要关注的是BI工具的性能。BI工具总是使用视图,通常向服务器发送类似的查询。
在其他过滤列上也有其他索引。主要问题仍然是-如何防止业绩恶化。另外,我想知道
发布于 2018-09-20 11:46:14
您有大约1亿行,每天增加新的部分,这些新的部分通常被选中。我应该在这些数字中使用分区索引,而不是常规索引。sql server中的解决方案将是分区。看看sql分区,看看是否可以采用它。分区是一种聚类形式,其中数据组共享一个物理块。例如,如果使用年份和月份,2018-09年的所有记录都将共享相同的物理空间,很容易找到。因此,如果使用这些过滤器(以及更多)选择记录,则表的大小为2018-09记录。这并不完全准确,但它很像它。小心分区的数据值--与标准PK集群相反,每个值都是唯一的,分区列应该会产生一组很好的不同的组合--因此分区。
如果不能使用分区,则必须使用常规索引自己创建“分区”。这需要做一些实验。基本思想是数据(一个数字?)表示一波或一组输入数据。就像今天和下一天输入的数据一样,10天将是波动“1”。接下来的10天将会是'2‘等等。过滤最新的,例如10波,你工作的最新100天导入有效地跳过所有其余的数据。粗略地说,如果您将现有的1亿行拆分为100行,然后从wave 101开始,搜索wave 90或更高,那么您将有1000万行可以搜索SQL是否正确地首先使用新的索引(最终也可以)。
发布于 2018-09-18 21:09:48
这是一个广泛的问题,尤其是在不了解你的系统的情况下。但是,我要尝试的一件事是,在加载数据之后,手动更新索引/表上的统计数据。对于那么大的表,您不太可能操纵足够多的行来触发自动更新。如果没有干净的统计数据,Server将无法获得准确的数据直方图。
接下来,深入研究您的执行计划,看看哪些操作员是最昂贵的。
https://stackoverflow.com/questions/52394112
复制相似问题