我正在评估在我当前的一个项目中使用ServiceStack的OrmLite,我需要对所创建的索引进行一些控制;我希望尽可能通过数据注释来控制这一点。
不幸的是,我没有运气强迫非顺序ID的索引是非群集的。使用下表模型:
[Alias("Players")]
public class Player
{
[Index(Unique = true, NonClustered = true)]
public Guid Id { get; set; }
[Required]
[StringLength(128)]
public string Url { get; set; }
}
CreateTableIfNotExists<Player>()
方法似乎忽略了创建非聚集索引的指示,而是创建了一个聚簇索引(这将导致index fragmentation and poor performance):
我在这里缺少什么?
注意:这是使用OrmLite 4.0.52,使用SqlServer2012Dialect
提供程序。
答案 0 :(得分:1)
这是一个非标准的RDBMS功能(即大多数RDBMS不支持),您必须在OrmLite之外进行管理,例如:手动dropping the clustered index on the Primary Key然后添加聚集索引。
您也可以利用Post Custom SQL Hooks来执行此操作。
答案 1 :(得分:1)
这可能会减轻您对非聚集索引的需求。
我使用Converter在其聚簇索引中获取顺序Guid的SQL Server喜欢以进行新插入。
public class SequentialSqlServerGuidConverter : SqlServerGuidConverter
{
public override object ToDbValue(Type fieldType, object value)
{
if (value is Guid && value.Equals(Guid.Empty))
{
var newGuid = SequentialGuidGenerator.NewSequentialGuid(SequentialGuidType.SequentialAtEnd);
return newGuid;
}
return base.ToDbValue(fieldType, value);
}
}
可在此处找到SequentialGuidGenerator
代码:http://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database
它显然具有将Guid.Empty的所有值更改为新的SequentialGuid的副作用。实际上,我们并不是要找到与Guid.Empty相等的行,所以它不是问题。