我有一个应用程序在几乎所有表中使用GUID作为主键,我已经读过使用GUID作为主键时存在性能问题.老实说,我没有看到任何问题,但我即将开始一个新的应用程序,我仍然想使用GUID作为主键,但我想使用复合主键(GUID和可能是另一个字段) .)
我正在使用GUID,因为当您拥有不同的环境(如"生产","测试"和"开发"数据库)以及数据库之间的迁移数据时,它们很好并且易于管理.
我将使用Entity Framework 4.3,我想在将其插入数据库之前在应用程序代码中分配Guid.(即我不想让SQL生成Guid).
创建基于GUID的主键的最佳做法是什么,以避免与此方法相关的假设性能命中?
sql-server database-design entity-framework guid primary-key
这属于我继承的项目,不能更改表结构或数据访问模型.我被要求优化用于将数据插入数据库的算法.
我们在表T中有一个数据集.从那里,我们拉出一个我们将调用A的集合.我们还查询XML feed并得到一个我们将调用X的集合.
所有这些更改都需要插回到数据库中.
设置的算法执行以下操作:
Query XML into a LIST
foreach over the XML LIST
look up foreach.item in A via LINQ (i.e. query = from record in A where
record.GUID == foreach.item.GUID
select record)
if query.Count() == 0
insert into A (via context.AddToTableName(newTableNameObject)
else
var currentRecord = query.First()
set all properties on currentRecord = properties from foreach.item
context.SaveChanges()
Run Code Online (Sandbox Code Playgroud)
我知道这不是最理想的.我试图将A放入foreach循环之外的对象(称为queryA),以便将查询移动到内存而不是访问磁盘,但在考虑完之后,我意识到数据库已经在内存中了.
已经将计时器对象添加到算法中,很明显,花费最多时间的是SaveChanges()函数调用.在某些情况下,它是20毫秒,而在其他一些情况下,在可解释的情况下,它会跳到100毫秒.
我宁愿只调用SaveChanges()一次.考虑到我对EF(最好是最薄的)知识的深度以及无法更改表结构并且必须保留不在X中的A的数据的限制,我无法弄清楚如何做到这一点.
建议?
我可以依赖.Net中的GUID多少钱?我的SA告诉了我
我们将GUID用作所有表中的主键.
我想知道GUID作为主键的可靠性.
可能会有重复的机会吗?
我们真的应该用这种方式吗?
表现怎么样?
任何建议对我都有帮助.
我不太了解数据库找到正确的词来提出这个问题,所以让我举一个例子来解释我正在尝试做的事情:假设我希望表的主键是我从中获取的ID API,但大多数API请求都会导致404错误.结果,我的表格看起来像这样:
我也不知道如何在Stack Overflow上格式化类似于表的结构,所以这将是一个粗略的视觉:
API_ID_PK | name
------------------
1 | Billy
5 | Timmy
23 | Richard
54 | Jobert
104 | Broccoli
Run Code Online (Sandbox Code Playgroud)
是否可以将ID按顺序分隔1位数?或者我应该这样做:
ID PK | API_ID | NAME
----------------------------------------
1 | 1 | Billy
2 | 5 | Timmy
3 | 23 | Richard
4 | 54 | Jobert
5 | 104 | Broccoli
Run Code Online (Sandbox Code Playgroud)
第二个表是否会因索引原因而更有效率?或者第一张表完美无缺?谢谢!
如果表上的ID列是唯一标识符(Guid),那么在ID列上创建聚簇主键是否有任何意义?
鉴于它们是全球唯一的,排序将如何运作?
我需要知道如何在我的存储过程中关闭ANSI警告.我一直在收到错误
字符串或二进制数据将被截断.
但是,我希望关闭它,以便我期待这一点,而宁愿允许它.
我补充说
SET ANSI_WARNINGS OFF
GO
Run Code Online (Sandbox Code Playgroud)
然而,在存储过程之前,执行此操作似乎根本不会抑制错误.
由于我开始使用此截断错误的原因,我的一个存储过程执行动态Sql以检索值(SQLFIddle显示代码).我必须将所有字段的长度设置为最大长度(NVarchar(3072)).然而,当执行我的查询时,我需要将它们打印到正确的大小,然后将它们打印到客户端.
非常感谢如何最好地处理这个问题.提前致谢.
sql-server ×4
primary-key ×3
sql ×3
database ×2
guid ×2
c# ×1
id ×1
indexing ×1
mysql ×1
t-sql ×1