我们最近更新了DataWarehouse(一个MS SQL 2000数据库),以包含一个新表来控制用户在所有其他表中访问信息的级别。新表没有太多细节,它有一个用户ID,以及一个可以访问的帐户ID列表。我们在DataWarehouse中的所有表都创建了相应的视图,并且我们已要求用户使用这些视图来访问数据(从而根据初始访问控制表中的访问级别限制其视图)。 / p>
对于使用其中许多视图的复杂查询,我们显然遇到了一个问题,即多次连接相同的访问控制表。我们目前无法做很多事情,因为有许多查询我们无法控制访问此资源。因此,我们需要对盒子本身进行任何更改,以优化访问速度。
Datawarehouse只在一夜之间更新,说实话,这个时间无关紧要 - 不需要插入速度,只需选择。如果需要的话,我们也可以重建索引。
我们遇到的问题是,尽管在此非唯一记录(UserID列)上有索引,但在执行执行计划跟踪时,我们会看到使用表扫描而不是Index Seek,我理解基本上忽略了索引。这导致可怕的性能影响 - 上周花了一分钟执行的查询现在可能需要10分钟,有些人正在推动一小时。
现在引用此表的所有其他视图都会加入到非索引列(帐户ID),然后根据用户的NT ID过滤掉返回的帐户数。
有没有人对我们如何改善表现有任何建议?无论是在短期内(我们可以在基础架构方面改变的事情),还是更长期的(对数据库架构的更改,尽管考虑到数据库使用方式的性质,但我们不能轻易做到这一点。)
谢谢!
大卫
答案 0 :(得分:0)
如果可以,您应该为您的用户提供如下操作的商店程序:
因此您只会加入相关数据。
它将显着改善查询时间(取决于db的大小与相关数据量之间的比率),并且不需要更改db方案。
答案 1 :(得分:0)
听起来你在UserId上有一个索引,但不是在连接中实际使用的AccountId。
如果我正确理解了您的索引,您可以尝试以下几点:
此外,在审查执行计划时,请查看搜索详细信息 - 它在寻求什么?这可以帮助您进一步优化系统的理想索引。
祝你好运!
答案 2 :(得分:0)
不幸的是,您没有提到您正在使用的报告工具(我的印象是用户编写了自己的查询?)或者您拥有的数据量是多少,但两个长期增强功能将是: