生成C#长唯一ID

生成C#长唯一ID,c#,uniqueidentifier,long-integer,C#,Uniqueidentifier,Long Integer,我有一个SQL数据库,其中包含一组具有唯一Id的表。很长一段时间以来,我一直在使用唯一标识符数据类型,并从我的C#接口传入guid。然而,为了提高查询速度,我决定改用bigint并传入long 每次运行代码时,创建唯一long的最简单方法是什么,这样就不会出现ID重复?确保bigint在数据库表中唯一的唯一方法是让SQL Server为您生成它-使其成为标识列 您是否确实使用uniqueidentifier测量了性能,并发现它太慢了?确保bigint在数据库表中是唯一的唯一方法是让SQL Ser

我有一个SQL数据库,其中包含一组具有唯一Id的表。很长一段时间以来,我一直在使用唯一标识符数据类型,并从我的C#接口传入guid。然而,为了提高查询速度,我决定改用bigint并传入long


每次运行代码时,创建唯一long的最简单方法是什么,这样就不会出现ID重复?

确保bigint在数据库表中唯一的唯一方法是让SQL Server为您生成它-使其成为标识列


您是否确实使用uniqueidentifier测量了性能,并发现它太慢了?

确保bigint在数据库表中是唯一的唯一方法是让SQL Server为您生成它-将其设置为标识列


您是否确实使用uniqueidentifier测量了性能,并发现它太慢了?

除了种子之外,还有其他生成唯一数字的选项。一种可能是根据时间生成一个数字,比如滴答声,或者更好地计算2009年初以来的秒数。然后根据创建号码的位置(或帐户,如果您不是在服务器上执行此操作)将唯一数字附加到号码的末尾(最低有效数字)


因此,如果您的新唯一号码是在app server 1上创建的,它的id是42,并且自2009年初以来已经是4000秒,那么您的新标识符将是400042。下一个生成的可能是400942,同时从不同服务器生成的可能是400943

除了种子之外,还有其他生成唯一数字的选项。一种可能是根据时间生成一个数字,比如滴答声,或者更好地计算2009年初以来的秒数。然后根据创建号码的位置(或帐户,如果您不是在服务器上执行此操作)将唯一数字附加到号码的末尾(最低有效数字)


因此,如果您的新唯一号码是在app server 1上创建的,它的id是42,并且自2009年初以来已经是4000秒,那么您的新标识符将是400042。下一个生成的可能是400942,同时从不同服务器生成的可能是400943

如果速度是一个问题,那么如果使用uniqueidentifier,您可以通过使用newsequantialID()函数而不是newID()生成它来改进查询。新方法生成顺序uniqueidentifier

如果速度是个问题,那么如果使用uniqueidentifier,可以通过使用newsequantialID()函数而不是newID()生成它来改进查询。新方法生成连续的唯一标识符

您在哪里看到减速?查询或插入/更新?我之所以问这个问题,是因为GUID作为主键对于插入/更新来说不是很好,因为它们不像IDENTITY那样是顺序的,并且可能会在键的聚集索引中引起一些震荡。但是SQLServer现在已经有了顺序GUI来解决这个问题。我听说很多关于使用GUID作为键速度慢的说法,但我想知道这到底有多真实。尤其是在64位机器上,比较128位数字真的比比较64位甚至32位数字慢很多吗?

你从哪里看到了这种慢?查询或插入/更新?我之所以问这个问题,是因为GUID作为主键对于插入/更新来说不是很好,因为它们不像IDENTITY那样是顺序的,并且可能会在键的聚集索引中引起一些震荡。但是SQLServer现在已经有了顺序GUI来解决这个问题。我听说很多关于使用GUID作为键速度慢的说法,但我想知道这到底有多真实。特别是在64位计算机上,比较128位数字真的比比较64位甚至32位数字慢很多吗?

否,但是一个存储ID值为3h38d9383-3j394juj93-3jd309d等的字段肯定比简单地使用一个从1递增到1000000等的整数要慢得多。我们过去发现,即使数据量相对较小(如50到100k记录),它也可能非常慢。@Goober:Guid也是一个整数,它只是更大。它是一个可以转换成数字的字符串。在sql server上进行比较时,它不算作一个数字。@Kevin:我肯定你在数据库中找到了这个。我想知道Goober是否在他的数据库中找到了它,以及他的负载,或者他是否在猜测。不,但肯定的是,存储值为3h38d9383-3j394juj93-3jd309d等的ID的字段会比简单地使用从1增加到1000000等的单个整数慢得多。我们过去发现,即使是相对较小的数据量(如50至10万条记录)它的速度可能会非常慢。@Goober:Guid也是一个整数,它只会更大。它是一个可以转换为数字的字符串。在sql server上进行比较时,它不会被算作数字。@Kevin:我肯定你在数据库中找到了它。我不知道Goober是在他的数据库中找到的,还是在加载,还是在猜测。