最近我们的一个 ASP.NET 应用程序显示了一个数据库死锁错误,我被要求检查并修复该错误。我设法找到死锁的原因是一个存储过程,它严格更新游标内的表。
这是我第一次看到这个错误,不知道如何有效地跟踪和修复它。我尝试了我知道的所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份栏。
后来我发现为部署编写数据库脚本的开发人员搞砸了。我添加了一个主键,问题就解决了。
我感到很高兴并回到我的项目中,并做了一些研究以找出导致僵局的原因......
显然,这是导致死锁的循环等待条件。没有主键的更新显然比有主键需要更长的时间。
我知道这不是一个明确定义的结论,这就是我在这里发布的原因......
我一直在查看 NoSQL 的维基百科页面,它列出了键/值存储数据库的几个变体,但我找不到关于键/值存储在这种情况下的含义的任何详细信息。有人可以向我解释或链接解释吗?另外,我什么时候会使用这样的数据库?
我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:
在我的特定情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?
我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是令人无法接受的缓慢,因为它会导致其他 spid 超时。
我查看了执行计划,我看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然没有确切地告诉我为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。
这是一个 SQL 2000 数据库。
我已经有点知道这个问题的答案了,但我总觉得我需要更多地了解这个话题。
我的基本理解是,一般来说,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引不太可能有用,但我已经看到了这种类型的事情。就像有人想的那样,“好吧,如果我们把所有这些东西都放在一个索引中,数据库就可以使用它来找到它需要的东西”,而从未见过一些正在运行的实际查询的执行计划。
想象一个像这样的表:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Run Code Online (Sandbox Code Playgroud)
我可能会看到一个包含name,customerId和dateCreated字段的索引。
但我的理解是这样的索引不会在查询中使用,例如:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Run Code Online (Sandbox Code Playgroud)
对于这样的查询,在我看来,更好的主意是包含customerId和dateCreated字段的索引,该customerId字段是“第一”。这将创建一个索引,该索引将以这样一种方式组织数据,以便该查询可以快速找到它需要的内容 - 按照它需要的顺序。
我看到的另一件事,也许和第一件事一样频繁,是每个字段的单独索引;所以,每一个上name,customerId和dateCreated领域。
与第一个例子不同,这种安排在我看来有时至少是部分有用的。查询的执行计划可能会显示至少它使用 上的索引customerId来选择记录,但它没有使用带有dateCreated字段的索引对它们进行排序。
我知道这是一个广泛的问题,因为对任何特定表集的任何特定查询的具体答案通常是查看执行计划所说的它将要做什么,否则将表和查询的细节纳入帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。
但我想我要问的是作为索引的一般“起点”,为特定的、经常提取的查询和 WHERE 或 ORDER BY 子句中的字段设置特定索引的想法有意义吗?
我有一个 ASP.NET MVC 应用程序,它与 SQL Server 2008 R2 Express 版下的数据库一起使用。需要定期执行更新数据库中的某些记录的任务。
不幸的是,Express Edition 缺少 SQL Agent。
你会推荐什么方法?
我正在使用 mysql,我需要以某种方式使用后面查询中准备好的语句返回的列 curid。我使用准备好的语句,因为正如我所读到的,它是将变量传递给 LIMIT 子句的唯一方法。我在这里有这个存储过程:
DROP PROCEDURE IF EXISTS fixbalance;
CREATE PROCEDURE fixbalance (userid INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE balance INT DEFAULT 0;
DECLARE idcnt INT;
SET idcnt = (SELECT COALESCE(COUNT(id), 0)
FROM coupon_operations
WHERE user_id = userid);
IF idcnt <> 0 THEN
WHILE i <= idcnt DO
BEGIN
SET @iter = i;
SET @user_id = userid;
SET @sql = CONCAT('SELECT id AS curid
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1'); …Run Code Online (Sandbox Code Playgroud) 什么查询会返回所有行都为 NULL 的表的列名?
我们有一个使用 Microsoft SQL 数据库的现成应用程序。在这个应用程序中,我们为每个报告挑选和选择各种选择标准。此应用程序然后运行这些报告。
我相信我们有一个查询计划问题。我们每天运行的第一个报表,运行速度非常快 7 分钟。我们在第一个报告之后运行的任何报告都需要一个多小时。
每天晚上,我们都会运行一个计划任务来停止和启动 SQL Server 代理和 SQL Server。在这个 SQL Server 实例中还有大约 25 个其他数据库。没有其他数据库有性能问题,只有我之前提到的现成产品。
有没有办法清除 SQL Server 当前内存中的所有查询计划?
如何在不影响依赖同一服务器上其他数据库的 30 个左右的用户的情况下执行此操作?
在同一台物理机上跨另一个数据库执行选择时是否会影响性能?所以我在同一个 SQL 2008 实例中运行的同一台物理机器上有 2 个数据库。
例如在 SomStoreProc on_this_db 我运行 SELECT someFields FROM the_other_db.dbo.someTable
到目前为止,我在互联网上读到的内容,大多数人似乎都表示不。
我想将数十亿行从 schema1.table1 移动到新的 schema2.table2,其中 table2 是从 table1 重构的。因此它们的表结构是不同的。table1 和 table2 都已分区,但 table2 为空。这两个模式都在同一个 oracle DB 中。执行此数据迁移的高效方法是什么?你想只在最后执行提交还是选择增量提交?即假设在完成 99% 的工作后数据迁移失败,这需要几个小时。你现在回滚吗?如果你做增量提交,你如何处理失败?
sql-server ×4
performance ×2
backup ×1
deadlock ×1
index ×1
insert ×1
jobs ×1
maintenance ×1
mysql ×1
nosql ×1
null ×1
oracle ×1
postgresql ×1
query ×1
schema ×1