在SQL Server 2012上使用ServiceStack OrmLite创建非聚集索引

时间:2016-01-20 17:45:20

标签: c# sql-server orm ormlite-servicestack

我正在评估在我当前的一个项目中使用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):

enter image description here

我在这里缺少什么?

注意:这是使用OrmLite 4.0.52,使用SqlServer2012Dialect提供程序。

2 个答案:

答案 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相等的行,所以它不是问题。