标签: newsequentialid

EF中的GUID COMB策略

有没有办法使用CodeFirst设计为新的Entity Framework 4.1中的对象实现Guid COMB身份策略?我认为设置StoreGeneratedPattern会工作,但它仍然给我正常的GUID.

c# entity-framework guid newsequentialid ef-migrations

9
推荐指数
2
解决办法
7687
查看次数

实体框架5首先将newsequentialid()编码为PK

如何newsequentialid()在PK列中使用默认值?

我有这个注释:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Run Code Online (Sandbox Code Playgroud)

但是这会产生随机的guid,我希望有顺序的guid.

我可以手动将数据库设置newsequentialid()为默认值,但是没有更好的选择吗?或者EF团队忘记了这个选项?

c# entity-framework newsequentialid

7
推荐指数
1
解决办法
5370
查看次数

UniqueIquenntifId上的NewSequentialId

我正在为我公司正在开始的新数据库制定数据库标准.我们尝试定义的一件事是与UniqueIdentifiers相关的主键和聚簇索引规则.

(注意:我不想讨论使用UniqueIdentifier作为主键或聚簇索引的利弊.网上有大量关于此的信息.这不是讨论.)

所以这是我担心的场景:

假设我有一个带有UniqueIdentifier的表作为聚簇索引和主键.让我们称之为ColA.我将ColA的默认值设置为NewSequentialId().

使用NewSequentialId()我插入三个连续的行:

{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3-440D-A9FE-CC7988DDF067}

然后我重启我的服务器.NewSequentialId文档说"重新启动Windows后,GUID可以从较低的范围重新开始,但仍然是全局唯一的."

因此下一个起点可能低于前一个范围.

所以重启后,我再插入3个值:

{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016-4645-ABA9-B098D2003E66}

(我不确定guid在数据库中是如何表示的,但我们假设因为这个从3开始,之前的7以7开始,3个比7个小".".

当您执行位于聚簇索引中间的插入时,必须重新映射索引.(至少我的DBA告诉过我.)每次重新启动时,我都冒着将新的UniqueIdentifier范围放在其他先前范围中间的风险.

所以我的问题是:由于下一组UniqueIdentifiers将小于最后一组,每个插入是否会导致我的聚簇索引混乱?

如果没有,为什么?SQL Server是否知道我正在使用NewSequentialId?这有什么补偿吗?

如果没有,那么它如何知道接下来会插入什么?也许接下来的百万次插入将从3开始.或者他们可能从7开始.它是如何知道的?

或者它不知道,只是保持一切顺序.如果是这种情况,则一次重启会严重影响性能.(这让我觉得我需要自己的自定义NewSequentialId,它不会受到重启的影响.)这是正确的吗?还是有一些我不知道的魔法?

编辑:我的标准强烈建议不要将GUID作为聚簇索引.正如我上面所说,有很多原因,这是一个坏主意.我试图找出这是否是另一个原因.

sql-server uniqueidentifier clustered-index sql-server-2008 newsequentialid

6
推荐指数
1
解决办法
1506
查看次数

为什么使用NEWID()比NEWSEQUENTIALID()使用更多的空间?

我正在做一些研究,我遇到了一个我无法解释的异常(我在Google上找不到任何东西).考虑以下SQL:

CREATE TABLE MyGuid (
    ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID()
)
GO
CREATE TABLE MyGuidSeq (
    ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID()
)
GO

DECLARE @i INT, @noRecords INT
SET @noRecords = 1000000

-- MyGuid
SET @i = 1
WHILE (@i <= @noRecords)
    BEGIN
        INSERT INTO MyGuid DEFAULT VALUES
        SET @i = @i + 1
    END

-- MyGuidSeq
SET @i = 1
WHILE (@i <= @noRecords)
    BEGIN
        INSERT INTO MyGuidSeq DEFAULT VALUES
        SET @i = @i + 1
    END …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server guid newid newsequentialid

6
推荐指数
1
解决办法
1031
查看次数

如何在C#中对顺序GUID进行排序?

顺序GUID是唯一的,但是是通过订单创建的; 该顺序略有异常,与使用标准.NET Guid比较器时获得的顺序不同.

我正在寻找一个C#Guid比较器,它将根据顺序GUID的规则进行排序.

==更新==

我特别指的是由SQL Server中的NewSequentialId()创建的顺序GUID,虽然我现在意识到标准的Win32 API调用UuidCreateSequential()使用与SQL Server不同的方案(我假设它们在我写这个问题时是相同的) .

==更新2 ==

petelids给出了以下答案,例如List <System.Data.SqlGuid> .Sort()给出以下序列(使用每个4位位置1的GUID的初始列表)...

01000000-0000-0000-0000-000000000000
10000000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000
00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000
00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0000-0001-0000-000000000000
00000000-0000-0010-0000-000000000000
00000000-0000-0000-0001-000000000000
00000000-0000-0000-0010-000000000000
00000000-0000-0000-0100-000000000000
00000000-0000-0000-1000-000000000000
00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000010
00000000-0000-0000-0000-000000000100
00000000-0000-0000-0000-000000001000
00000000-0000-0000-0000-000000010000
00000000-0000-0000-0000-000000100000
00000000-0000-0000-0000-000001000000
00000000-0000-0000-0000-000010000000
00000000-0000-0000-0000-000100000000
00000000-0000-0000-0000-001000000000
00000000-0000-0000-0000-010000000000
00000000-0000-0000-0000-100000000000
Run Code Online (Sandbox Code Playgroud)

与List <System.Guid>返回的以下顺序相反..Sort()

00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000010
00000000-0000-0000-0000-000000000100
00000000-0000-0000-0000-000000001000
00000000-0000-0000-0000-000000010000
00000000-0000-0000-0000-000000100000
00000000-0000-0000-0000-000001000000
00000000-0000-0000-0000-000010000000
00000000-0000-0000-0000-000100000000
00000000-0000-0000-0000-001000000000
00000000-0000-0000-0000-010000000000
00000000-0000-0000-0000-100000000000
00000000-0000-0000-0001-000000000000
00000000-0000-0000-0010-000000000000
00000000-0000-0000-0100-000000000000
00000000-0000-0000-1000-000000000000
00000000-0000-0001-0000-000000000000
00000000-0000-0010-0000-000000000000
00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000
00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000 …
Run Code Online (Sandbox Code Playgroud)

c# guid newsequentialid

6
推荐指数
2
解决办法
3671
查看次数

将现有表上的 newid() 更改为 newsequentialid()

目前,我们有许多表在主键上使用 newid() 。这导致了大量的碎片。所以我想更改该列以使用 newsequentialid() 代替。

我认为现有数据仍将保持相当分散,但新数据的分散程度将减少。这意味着我也许应该等待一段时间,然后再将 PK 索引从非聚集更改为聚集。

我的问题是,有人有这样做的经验吗?有什么是我忽略的、应该注意的吗?

sql newid clustered-index newsequentialid

5
推荐指数
1
解决办法
4437
查看次数

NEWSEQUENTIALID有多可预测?

根据微软的文档NEWSEQUENTIALID,NEWSEQUENTIALID的输出是可预测的.但可预测的可预测性如何?假设我有一个生成的GUID,NEWSEQUENTIALID它有多难:

  • 计算下一个值?
  • 计算以前的值?
  • 计算第一个值?
  • 计算第一个值,即使根本不知道任何GUID?
  • 计算行数?例如,当使用整数时,/order?id=842告诉我应用程序中有842个订单.

以下是关于我正在做什么以及各种权衡取舍的背景信息.

使用GUID比整数作为主键的一个安全好处是GUID很难猜到.例如,黑客看到/user?id=845他可能尝试访问的URL /user?id=0,因为数据库中的第一个用户很可能是管理用户.此外,黑客可以迭代/user?id=0..1..2以快速收集所有用户.

同样,整数的隐私缺点是它们泄露信息./order?id=482告诉我,网上商店自实施以来已经有482个订单.

不幸的是,使用GUID作为主键具有众所周知的性能缺点.为此,SQL Server引入了该NEWSEQUENTIALID功能.在这个问题中,我想了解输出的可预测性NEWSEQUENTIALID.

sql sql-server guid primary-key newsequentialid

5
推荐指数
2
解决办法
1118
查看次数

是否有一个 R 函数可以按照它在数据集中出现的顺序为数据框中的每个值顺序分配一个代码?

我有一个包含一长串别名值的表,如下所示:

> head(transmission9, 50)
# A tibble: 50 x 2
   In_Node  End_Node
   <chr>    <chr>   
 1 c4ca4238 2838023a
 2 c4ca4238 d82c8d16
 3 c4ca4238 a684ecee
 4 c4ca4238 fc490ca4
 5 28dd2c79 c4ca4238
 6 f899139d 3def184a
Run Code Online (Sandbox Code Playgroud)

我想让 R 遍历两列并按顺序为每个值分配一个数字,按照别名值出现在数据集中的顺序。我希望 R 首先跨行读取,然后向下读取列。例如,对于上面的数据集:

   In_Node  End_Node
   <chr>    <chr>   
 1  1       2
 2  1       3
 3  1       4
 4  1       5
 5  6       1
 6  7       8
Run Code Online (Sandbox Code Playgroud)

这可能吗?理想情况下,我也希望能够生成一个“密钥”,它将每个顺序代码与每个别名值相匹配,如下所示:

Code Value
1    c4ca4238
2    2838023a
3    d82c8d16
4    a684ecee
5    fc490ca4
Run Code Online (Sandbox Code Playgroud)

预先感谢您的帮助!

alias r newsequentialid dataframe

5
推荐指数
3
解决办法
48
查看次数

使用带有UPDATE触发器的NEWSEQUENTIALID()

我在我的表中添加了一个新的GUID/Uniqueidentifier列.

ALTER TABLE table_name
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID()
GO
Run Code Online (Sandbox Code Playgroud)

当表中更新记录时,我想更新此列"VersionNumber".所以我创建了一个新的触发器

CREATE TRIGGER [DBO].[TR_TABLE_NAMWE]
ON [DBO].[TABLE_NAME]
AFTER UPDATE
AS 
BEGIN 
    UPDATE TABLE_NAME
    SET VERSIONNUMBER=NEWSEQUENTIALID()
    FROM TABLE_NAME D
    JOIN INSERTED I ON D.ID=I.ID/* some ID which is used to join*/
END
GO
Run Code Online (Sandbox Code Playgroud)

但只是意识到NEWSEQUENTIALID()只能与CREATE TABLE或一起使用ALTER TABLE.我收到了这个错误

The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be …
Run Code Online (Sandbox Code Playgroud)

sql-server triggers guid sql-server-2008 newsequentialid

4
推荐指数
1
解决办法
1932
查看次数

Sequential Guid主键列应该是聚簇索引吗?

使用顺序guid的目的是使用聚簇索引而不会出现聚簇索引中通常存在的高级碎片(如果它是常规guid),对吗?

sql-server guid clustered-index sql-server-2008 newsequentialid

3
推荐指数
1
解决办法
1688
查看次数

生成的顺序GUID有时不是顺序的

我有一个C#应用程序,它为我插入表中的每一行生成一个顺序GUID.我希望插入的GUID是顺序的,但有时它们会破坏序列(以块为单位).

例:

按顺序打破

这些GUID按插入顺序显示.

为什么这些"顺序"GUID是在如此大的序列中断的情况下创建的?


用于生成顺序GUID的代码:

class NativeMethods
{
    [DllImport("rpcrt4.dll", SetLastError = true)]
    public static extern int UuidCreateSequential(out Guid guid);
}

public static Guid CreateSequentialGuid()
    {
        const int RPC_S_OK = 0;

        Guid guid;
        int result = NativeMethods.UuidCreateSequential(out guid);
        if (result == RPC_S_OK)
            return guid;
        else
            return Guid.NewGuid(); //<--In debugging, this statement never runs.
    }
Run Code Online (Sandbox Code Playgroud)

循环中使用的代码,用于将新GUID和信息插入表中:

Guid mySequentialGUID = CreateSequentialGuid();
string[] row = { item1,
                 item2,
                 item3,  
                 sourceText,
                 encoding.ToString(),
                 mySequentialGUID.ToString()
             };
var listViewItem = new ListViewItem(row);
myListView.Items.Add(listViewItem);
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅此问题以了解顺序GUID:

c# guid newsequentialid sequential

3
推荐指数
1
解决办法
1155
查看次数