我有一些使用 Entity Framework Code First 创建的数据库;应用程序正在运行,总的来说,我对 Code First 让我做的事情感到非常满意。我首先是一名程序员,其次是 DBA,这是必要的。我正在阅读 DataAttributes 以在 C# 中进一步描述我希望数据库执行的操作;我的问题是:将这些nvarchar(max)字符串放在我的桌子上会吃什么惩罚(见下面的例子)?
在这个特定的表中有几列;在 C# 中,它们是这样定义的:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }
Run Code Online (Sandbox Code Playgroud)
我希望根据名称、来源、生成和书面内容进行查询和/或排序。我希望 Name 和 Source 的长度为 0-50 个字符,有时可达 150 个。我希望这个表开始时很小(<100k 行),但随着时间的推移显着增长(>1m 行)。显然消息可以是小或大的,并且可能不会被查询。
我想知道的是,我的 Name 和 Source …
sql-server entity-framework sql-server-2008-r2 azure-sql-database
上周我们的数据库发生了一些奇怪的事情。突然之间,应用程序阻止了我们无法保存新实体等的用户。在查看 SQL Server(2008 兼容模式 2005)的活动监视器后,我看到以下三个条目:

一段时间后,用户出现连接超时。当我杀死进程64时,他们可以再次正常保存。
问题是他们在块期间尝试保存的实体被多次插入数据库(最多 3 次),即使有代码可以防止这种情况发生(数字列必须是唯一的但没有约束...检查发生在代码中)。
我们使用实体框架 6.0。
我有一个带有触发器的视图instead of,我尝试将其与 EF Core 一起使用,EF Core 尝试以merge语句的形式将批量插入一起。这是我的表格和视图:
create table tbl (id uniqueidentifier not null primary key, data nvarchar(max) null)
go
create view vwTbl as select * from tbl
go
create trigger vwTblInsert on vwTbl instead of insert as
insert into tbl (id, data)
select id, data
from inserted
go
Run Code Online (Sandbox Code Playgroud)
以下是 EF 生成的近似 SQL:
declare @inserted1 table ([id] uniqueidentifier);
merge vwTbl using (
values (newid(), 'xxx')
) as i (id, data) on 1=0
when not matched then …Run Code Online (Sandbox Code Playgroud) 我有一个交易表,每笔交易涉及 5-6 个联系人。每个联系人都有相同的字段,如姓名、地址、单元格、电子邮件等。
所以我猜最好的办法是使用相同的联系表并将其与事务表关联 5 次..所以我不需要制作相同类型的表 5 次。
当我与实体框架连接时,问题就开始了,这只需要一种关系。
我的问题是我应该为每种联系人类型制作 6 个联系人副本,还是使用 6 个连接表会更好(一个只有 2 个 ID 的表,所以我可以进行连接)?
我认为这是一个非常普遍的问题,但我找不到明确的信息,最好的方法是什么。
编辑: 
嗯,这是假设的场景,但我想了解的是从死后日志(例如 SQL Server Profiler 跟踪)到识别 ORM 情况下的代码的路径。为了让它不会太模糊,请考虑这样的场景:
那么,在这种情况下,DBA(也是 VB.Net 开发人员)从日志中诊断哪些代码(在这种情况下,Linq 查询)造成问题的通用路径是什么?在这种情况下,该应用程序正常,但会影响使用相同数据库/服务器的其他应用程序的响应时间。
那会与 Java+Hiberate 进程有很大不同吗?
编辑:我想了解从跟踪到罪魁祸首元查询的路径。如果应用程序中有 SQL,这意味着“在文件中查找”会话(在极端情况下可能带有一些正则表达式)可以将检查任务的目标减少到几十个可疑对象,而不是十分之一甚至数百个源文件。使用 ORM,如何使用 ORM(在这种情况下:EF)到达那个阶段?
我正在与一位正在努力阻止以下错误的开发人员合作:
服务器将断开连接,因为客户端驱动程序在会话处于单用户模式时发送了多个请求。当客户端在会话中仍有批处理运行时发送重置连接的请求,或者当会话正在重置连接时客户端发送请求时,会发生此错误。请联系客户端驱动程序供应商。
发生此错误时,典型的结果是会话持有锁,但没有运行 SQL(sys.dm_exec_requestssession_id没有行),并导致阻塞,直到它被终止。阻塞的原因很简单,但如何阻止错误发生却不是。
关于这个问题的一些事实:
sys.dm_exec_connections为 .Net SqlClient Data Providernet_transport在sys.dm_exec_connections表演Session。如果在连接字符串上设置 Async=true ,它应该可以防止出现此问题。如果您正在使用 MARS 并在多个并发线程上使用相同的连接,则可能发生的情况是重置连接的调用可能会稍微延迟并触发此错误。如果您设置 Async=true,我们会在客户端驱动程序中执行额外的锁定以防止这种情况发生。
关于此错误的更多信息很少。这似乎表明客户端的程序sp_reset_connection在批处理仍在运行时正在调用。我可以设置一个跟踪来确认这一点,但我必须记录很多不相关的活动,而且问题每隔几天才会发生一次。此外,我不确定开发人员是否能够利用这些证据来解决问题。
作为 DBA 或系统管理员,我是否可以使用任何其他技术来进一步解决此问题,或者我可以向开发人员提出任何可能为他提供有用信息或使问题不太可能发生的建议?
让我给你一些设置。我们在 MySQL 5.1 上有一个 InnoDB 表,有近 2000 万条记录,没有外键,以及我们所做的查询的适当索引。我们正在为 .NET Entity Framework 使用最新的 6.3.5 MySQL 版本。通常我们习惯于处理 SQL Server 和实体框架,但在这个项目中我们决定尝试一下 MySQL。
我对这个问题有一些理论,但让我先做代码设置
EF LINQ 查询
var failsForAcct1001 = db.Failures.Where(x => x.AccountId == 1001);
/* farther down and later on in the code */
return failsForAcct1001.OrderBy(x => x.FailureId).Take(50);
Run Code Online (Sandbox Code Playgroud)
生成的 MySQL 代码
请忽略列名,它们不是理解问题所必需的
select
External1.FailureId,
External1.col2,
External1.col3,
from (select
Inner1.FailureId,
Inner1.col2,
Inner1.col3,
from Failures Inner1
where External1.AccountId = 1001
) External1
order by External1.FailureId
limit 50
Run Code Online (Sandbox Code Playgroud)
生成的这个 SQL 与 SQL Server 中发生的情况非常相似,SQL 处理它没有问题。这不仅仅是一个实体框架问题,当我接受这个查询并在 MySQL …
这个问题的灵感来自发布到最新 ServerFault 博客文章的评论:
你们还在使用 LINQ to SQL 吗?
我知道我可以使用SQL Server Profiler和/或该ToTraceString方法来查看生成的查询和分析他们自己。但是,我正在寻找具有管理由使用实体框架的应用程序访问的数据库的实践经验的人的意见。
实体框架查询是性能问题的常见原因吗?
在这种情况下可以优化 LINQ 查询还是原始 Transact-SQL 是唯一的解决方案?
我有一个使用以下 T-SQL 创建的表:
CREATE TABLE [dbo].[TableName](
[id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我今天查看了这张表,注意到 id 列正在跳过值:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26、27、1027、1028、1029、1030、1031、1032、1033、1034、1035、2034、2035、3034
我不担心这个或任何事情(我的应用程序不关心主键是什么),我只是想知道可能导致这种情况发生的原因。似乎确实有一种模式,每次“跳跃”发生时跳跃 1000。
我的应用程序使用实体框架插入这些行,如果这有什么不同的话。
sql-server entity-framework auto-increment identity sql-server-2012
我在查询我的 SQL Server 数据库时遇到了超时,特别是一张表。我尝试更新统计数据并修复了几天的性能问题。
我开始深入挖掘,发现有一个预定的同步任务,可以从 Web 服务中检索数据并更新数据库。为此,此任务使用实体框架。几位同事试图解决这个问题,但到目前为止没有运气。我想退后一步。
有人可以在这种情况下为我提供更多信息或见解以获得线索,以便我可以在引入新工具和解决方案之前尝试修复代码。
entity-framework ×10
sql-server ×8
orm ×3
performance ×2
ado.net ×1
c# ×1
etl ×1
identity ×1
merge ×1
mysql ×1
trigger ×1