在 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 的行,所以这不是问题。
我正在评估在我当前的一个项目中使用 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 的行,所以这不是问题。