我正在接管一个数据库,其中的一个表正在失控地增长。它有2011年、2012年、2013年以及未来的交易记录。
这张桌子对公司的运营至关重要。但它正在失控地增长,有730k条记录,并且随着每两周增加一次交易而不断增长。
我不希望改变表的现有结构,因为许多现有的操作都依赖于它,到目前为止,它有一个关于事务ID和事务日期的索引。但是查询表变得非常麻烦。
通过使用left(date,4)作为索引的一部分,是否可以将它们索引到事务日期所在的年份?
编辑:表没有规范化(我也看不出规范化的目的,因为每一行对于索赔编号都是唯一的),每条记录有168个字段,其中有5个不同的varchar "memo“字段(255)。
发布于 2013-02-20 03:44:21
其中一个选项是创建一个Filtered Index -它类似于根据特定条件联合一组记录。
在您的例子中,您应该创建多个索引-每个索引过滤特定年份的记录。例如:
CREATE NONCLUSTERED INDEX IndexFor2013Year
ON MyTable.BillOfMaterials (SomeDate)
WHERE SomeDate>"2013-01-01 00:00:00" and SomeDate<"2014-01-01 00:00:00";
GO无论如何,为经常执行DML操作(UPDATE/ INSERT/ DELETE)的表创建许多索引甚至可能导致较差的性能。
您应该执行一些测试并比较执行计划。
请注意,我只是举了一个例子--根据查询的具体内容,您应该创建一个索引。有时,在观察查询的执行计划时,SQL Management Studio (2012)建议我使用什么样的索引才能获得更好的性能。
https://stackoverflow.com/questions/14965808
复制相似问题