小编Cod*_*awk的帖子

造成死锁的主要原因是什么,它们可以预防吗?

最近我们的一个 ASP.NET 应用程序显示了一个数据库死锁错误,我被要求检查并修复该错误。我设法找到死锁的原因是一个存储过程,它严格更新游标内的表。

这是我第一次看到这个错误,不知道如何有效地跟踪和修复它。我尝试了我知道的所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份栏。

后来我发现为部署编写数据库脚本的开发人员搞砸了。我添加了一个主键,问题就解决了。

我感到很高兴并回到我的项目中,并做了一些研究以找出导致僵局的原因......

显然,这是导致死锁的循环等待条件。没有主键的更新显然比有主键需要更长的时间。

我知道这不是一个明确定义的结论,这就是我在这里发布的原因......

  • 缺少主键是问题吗?
  • 除了(互斥、保持等待、无抢占和循环等待)之外,是否还有其他条件会导致死锁?
  • 如何防止和跟踪死锁?

sql-server-2008 sql-server deadlock

57
推荐指数
5
解决办法
7万
查看次数

什么是键/值存储数据库?

我一直在查看 NoSQL 的维基百科页面,它列出了键/值存储数据库的几个变体,但我找不到关于键/值存储在这种情况下的含义的任何详细信息。有人可以向我解释或链接解释吗?另外,我什么时候会使用这样的数据库?

nosql

57
推荐指数
5
解决办法
10万
查看次数

我怎么知道为什么某个表上的插入很慢?

我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:

  • 表上存在 INSERT TRIGGERs
  • 许多必须检查的强制约束(通常是外键)
  • 在表中间插入一行时聚集索引中的页面拆分
  • 更新所有相关的非聚集索引
  • 阻止桌子上的其他活动
  • IO 写响应时间差
  • ......我错过了什么?

在我的特定情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?

我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是令人无法接受的缓慢,因为它会导致其他 spid 超时。

我查看了执行计划,我看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然没有确切地告诉我为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。

这是一个 SQL 2000 数据库。

sql-server insert sql-server-2000 database-tuning

30
推荐指数
4
解决办法
6万
查看次数

我是否需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

我已经有点知道这个问题的答案了,但我总觉得我需要更多地了解这个话题。

我的基本理解是,一般来说,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引不太可能有用,但我已经看到了这种类型的事情。就像有人想的那样,“好吧,如果我们把所有这些东西都放在一个索引中,数据库就可以使用它来找到它需要的东西”,而从未见过一些正在运行的实际查询的执行计划。

想象一个像这样的表:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Run Code Online (Sandbox Code Playgroud)

我可能会看到一个包含name,customerIddateCreated字段的索引。

但我的理解是这样的索引不会在查询中使用,例如:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated
Run Code Online (Sandbox Code Playgroud)

对于这样的查询,在我看来,更好的主意是包含customerIddateCreated字段的索引,该customerId字段是“第一”。这将创建一个索引,该索引将以这样一种方式组织数据,以便该查询可以快速找到它需要的内容 - 按照它需要的顺序。

我看到的另一件事,也许和第一件事一样频繁,是每个字段的单独索引;所以,每一个上namecustomerIddateCreated领域。

与第一个例子不同,这种安排在我看来有时至少是部分有用的。查询的执行计划可能会显示至少它使用 上的索引customerId来选择记录,但它没有使用带有dateCreated字段的索引对它们进行排序。


我知道这是一个广泛的问题,因为对任何特定表集的任何特定查询的具体答案通常是查看执行计划所说的它将要做什么,否则将表和查询的细节纳入帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。

但我想我要问的是作为索引的一般“起点”,为特定的、经常提取的查询和 WHERE 或 ORDER BY 子句中的字段设置特定索引的想法有意义吗?

index sql-server

22
推荐指数
2
解决办法
2571
查看次数

SQL Server Express 的任务调度程序

我有一个 ASP.NET MVC 应用程序,它与 SQL Server 2008 R2 Express 版下的数据库一起使用。需要定期执行更新数据库中的某些记录的任务。

不幸的是,Express Edition 缺少 SQL Agent。
你会推荐什么方法?

sql-server-2008 backup express-edition maintenance jobs

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

如何在 MySQL 存储过程中使用准备好的语句?

我正在使用 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)

mysql stored-procedures prepared-statement

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

在 PostgreSQL 中查找表的空列

什么查询会返回所有行都为 NULL 的表的列名?

schema postgresql null database-design

18
推荐指数
3
解决办法
2万
查看次数

您如何从 Microsoft SQL Server 中清除所有旧的查询计划?

我们有一个使用 Microsoft SQL 数据库的现成应用程序。在这个应用程序中,我们为每个报告挑选和选择各种选择标准。此应用程序然后运行这些报告。

我相信我们有一个查询计划问题。我们每天运行的第一个报表,运行速度非常快 7 分钟。我们在第一个报告之后运行的任何报告都需要一个多小时。

每天晚上,我们都会运行一个计划任务来停止和启动 SQL Server 代理和 SQL Server。在这个 SQL Server 实例中还有大约 25 个其他数据库。没有其他数据库有性能问题,只有我之前提到的现成产品。

有没有办法清除 SQL Server 当前内存中的所有查询计划?

如何在不影响依赖同一服务器上其他数据库的 30 个左右的用户的情况下执行此操作?

performance sql-server query

12
推荐指数
3
解决办法
2万
查看次数

SQL Server 2008 - 同一物理机和服务器实例上的跨数据库性能

在同一台物理机上跨另一个数据库执行选择时是否会影响性能?所以我在同一个 SQL 2008 实例中运行的同一台物理机器上有 2 个数据库。

例如在 SomStoreProc on_this_db 我运行 SELECT someFields FROM the_other_db.dbo.someTable

到目前为止,我在互联网上读到的内容,大多数人似乎都表示不。

performance sql-server-2008

12
推荐指数
1
解决办法
9260
查看次数

大数据移动

我想将数十亿行从 schema1.table1 移动到新的 schema2.table2,其中 table2 是从 table1 重构的。因此它们的表结构是不同的。table1 和 table2 都已分区,但 table2 为空。这两个模式都在同一个 oracle DB 中。执行此数据迁移的高效方法是什么?你想只在最后执行提交还是选择增量提交?即假设在完成 99% 的工作后数据迁移失败,这需要几个小时。你现在回滚吗?如果你做增量提交,你如何处理失败?

oracle

12
推荐指数
2
解决办法
691
查看次数