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

Creating non-clustered indexes with ServiceStack OrmLite on SQL Server 2012

我正在评估在我当前的一个项目中使用 ServiceStack 的 OrmLite,我需要对创建的索引进行一些控制;我更愿意尽可能地通过数据注释来控制这些。

不幸的是,我没有运气将非顺序 ID 上的索引强制为非聚集。使用以下 table 模型:

[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 提供程序。

这是一个 non-standard RDBMS 功能(即大多数 RDBMS 不支持),您必须在 OrmLite 之外进行管理,例如:手动 dropping the clustered index on the Primary Key 然后添加聚簇索引。

您也可以利用 Post Custom SQL Hooks 来做到这一点。

这可能会减轻您对 non-clustered 索引的需求。

我使用转换器在其聚集索引中获取顺序 Guid 的 SQL 服务器喜欢的新插入。

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 的行,所以这不是问题。