小编Ran*_*gen的帖子

事务日志报告已满但未满

批处理作业错误电子邮件报告:

数据库“WebDB”的事务日志已满。

不,不是。它 90% 免费。事务日志备份正常运行。我的硬件人员告诉我硬件运行良好,有足够的空间。SQL Server 2008 SP3,但不是 R2。

我是一名开发人员,我们不再有 DBA。所以我有责任尝试解决这个问题。

sql-server-2008 sql-server

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

为什么将 CTE 写入实际表会提供性能改进?

我是 CTE 的忠实粉丝。他们是最棒的。你知道,我知道,我们都知道。

今天,如果将 CTE 写入真实表,我的查询速度会提高 1000 倍左右。

查询本身在链接中,但我怀疑它并不重要。为简化起见,我需要一份保险单中所有索赔的清单,其中一项索赔满足特定条件(cat = 1)。

简化版本如下所示:

    with cat_claims as (select distinct pol_nbr from claims where cat = 1)

    select * from claims c
    inner join policies p on p.polnbr = c.polnbr
    inner join cat_claims cat on c.pol_nbr= cat.pol_nbr
Run Code Online (Sandbox Code Playgroud)

这是超级骗子慢。如果我重写它看起来像这样:

    with cat_claims as (select distinct claim_nbr from claims where cat = 1)

    select * into cat_claims
    from cat_claims

    select * from claims c
    inner join policies p on p.polnbr = c.polnbr
    inner join cat_claims cat …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

针对一个存储过程的 sp_blitzCache

最近我们开始使用 sp_BlitzCache 来帮助我们调整我们的查询。我们发现一个 SP 有一些问题,我们能够成功地重构它。

在我们调整查询之前的一周内,我有一份 sp_BlitzCache 的输出副本,可在此处获得

https://drive.google.com/open?id=1oiAEl62ZT51qcCEhVzkg8oDA3HB-NCsv

生成此输出的命令运行是

exec sp_BlitzCache @StoredProcName = 'hs_UpdateShipmentPackagesAndWeightSp'
Run Code Online (Sandbox Code Playgroud)

几个问题

1)我注意到我们有多个行用于同一个计划句柄,这是为什么?

2) 您会注意到成本最高的查询 (1451) 具有整个 create procedure 语句的查询文本,这是什么意思?该行的指标是否仅用于创建存储过程?

3) 对于成本最高的行,即上面提到的行,它的最小/最大授权几乎为 2GB。这是否意味着当我们运行 create procedure 语句时,它要求 2gb 的内存?还是在调用 proc 时使用此计划?我想这与问题 2 的答案有关

4) 为什么在某些情况下我们有 Min/Max grant KB > 0 和 Min/Max used grant kb > 0,但百分比内存授权为 null ?

我们正在运行 SQL Server 2012。

谢谢,凯文

sql-server execution-plan sql-server-2012 sp-blitzcache

2
推荐指数
1
解决办法
953
查看次数

具有相同 object_id 但名称不同的索引

当我跑

SELECT
  count(object_id) AS count,
  object_id,
  min(name) as name1,
  max(name) AS name2
FROM
  sys.indexes
GROUP BY object_id HAVING COUNT(*) > 1 ORDER BY count
Run Code Online (Sandbox Code Playgroud)

我将获得具有相同object_id但不一定具有相同名称的索引列表。

不应该所有object_id具有相同名称的索引都具有相同的名称吗?

index sql-server t-sql

2
推荐指数
1
解决办法
340
查看次数

为什么处理有时会终止,有时不会

DECLARE @Error int;
INSERT INTO Person.BusinessEntityContact
 (BusinessEntityID
 ,PersonID
 ,ContactTypeID)
 VALUES
 (0,0,1);
SELECT @Error = @@ERROR;
PRINT ‘The Value of @Error is ‘ + CONVERT(varchar, @Error);
Run Code Online (Sandbox Code Playgroud)

我有 :

消息 547,级别 16,状态 0,第 4 行 INSERT 语句与 FOREIGN KEY 约束“FK_BusinessEntityContact_Person_PersonID”相冲突......该语句已终止。@Error 的值为 547

这意味着在抛出错误后该过程仍在继续。

但是,如果我尝试创建一个表(运行以下脚本两次以触发错误)为:

CREATE TABLE OurIFTest(
 Col1 int PRIMARY KEY
 );
IF @@ERROR != 0
 PRINT 'Problems!';
ELSE
 PRINT 'Everything went OK!';
Run Code Online (Sandbox Code Playgroud)

然后我得到了

消息 2714,级别 16,状态 6,第 2 行 数据库中已经有一个名为“OurIFTest”的对象。

这意味着该进程在抛出错误时终止。

那么为什么该过程因“创建”而终止,而不因“插入”而终止?

sql-server error-handling

2
推荐指数
1
解决办法
97
查看次数

移动 DB/LOG 文件 - 分离/附加 - 问题

我想移动数据库的 MDF/LDF 文件位置。从我读到的内容来看,我发现我应该使用分离/附加,而不仅仅是将数据库脱机并重新定位文件。我就是这样做的,并使用以下内容重新连接数据库。

CREATE DATABASE MyAdventureWorks   
    ON (FILENAME = 'C:\MySQLServer\AdventureWorks2012_Data.mdf'),  
    (FILENAME = 'C:\MySQLServer\AdventureWorks2012_Log.ldf')  
    FOR ATTACH;  
GO
Run Code Online (Sandbox Code Playgroud)

当然使用我的新文件位置,它使用了两个单独的卷,而不是从中移动的位置。

BUUUT,所有这些都是将文件放回我没有指定的原始卷上。它还将数据库置于只读状态。

任何帮助,将不胜感激。

谢谢

SQL Server 2016

sql-server sql-server-2016

2
推荐指数
1
解决办法
624
查看次数

查询存储审计

我们经常使用查询存储强制计划功能。
我们想审核何时以及谁强制执行每个计划。
是否需要扩展事件会话来审核此事件,
或者有包含此特定信息的 dmvs 或目录视图?

sql-server sql-server-2016 query-store

2
推荐指数
1
解决办法
95
查看次数

我们如何知道 SQL Server 中安装的 SQL Replication 组件

有人可以让我知道我们如何识别 SQL 服务器中是否安装了复制组件。

试过如下:

1.我们之前更改了服务器名称,因此在检查配置分发服务器和发布时给出以下警告。

标题:配置分发向导

SQL Server 无法连接到服务器“xxxxxxxx”。

附加信息:

SQL Server 复制需要实际的服务器名称才能连接到服务器。指定实际的服务器名称“zzzzzzzzz”。(复制。实用程序)


我将重命名服务器。

  1. 在尝试配置订阅时给出以下警告。

标题:新订阅向导

 

Microsoft SQL Server Management Studio 无法访问复制组件,因为此 SQL Server 实例上未安装复制。有关安装复制的信息,请参阅 SQL Server 联机丛书中的安装复制主题。

附加信息:  

此服务器上未安装复制组件。再次运行 SQL Server 安装程序并选择安装复制的选项。(Microsoft SQL Server,错误:21028)

现在,请建议 SQL 实例中是否安装了 Replication 组件

replication sql-server

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

SQL SERVER 将 BLOB 数据转换为 STRING

我正在尝试从 SQL SERVER 2008 R2 数据库中提取 blob 数据。数据是应用程序存储的注释数据。我做了一些研究,并且在转换数据方面取得了部分成功。我得到每个条目的大约 20-30 个第一个字符。这是我使用的 SQL 语句:

select CONVERT(varchar(MAX), CONVERT(varbinary, blob)) from annotation_data;
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到所有的数据?

sql-server sql-server-2008-r2

0
推荐指数
1
解决办法
6583
查看次数

在以下库存系统中,是否可以强制行锁以避免死锁并确保其按预期工作?

我想为 M 个用户自动保留 N 个对象的库存。

我有两张库存跟踪表,一张用于全球库存,一张用于个人库存。

  • 全局清单表列:ObjectID uniqueidentifier、Count int
  • 个人库存表列:UserID nvarchar(64)、ObjectID uniqueidentifier、Count int

有两个表,因为我必须为每个对象以及每个用户强制执行最大允许保留。例如,一个对象可能被限制为总共保留 1000 个,每个用户最多保留 10 个该对象。

全局清单表以 [ObjectID] 为唯一键,个人清单表以 [UserID, ObjectID] 为唯一键。

  • 主键是每个表上的唯一索引,因此只对行进行锁定,而不会对其他索引键进行锁定。
  • 全局清单表将始终驻留在单个数据库中。
  • 个人库存表可以跨多个数据库进行分片,因此更新全局和一个或多个个人表的事务可能是分布式的。
  • 此“保留库存”事务是将在这些表上执行的唯一事务。

为 3 个对象保留库存的示例请求如下所示。一些对象有限制,而另一些则没有。

[
    {ObjectID: 'A', QuantityToReserve: 1},
    {ObjectID: 'C', QuantityToReserve: 2, GlobalMax: 1000, PersonalMax: 10},
    {ObjectID: 'B', QuantityToReserve: 5}
]
Run Code Online (Sandbox Code Playgroud)
  • 这种为多个对象保留库存的请求必须以原子方式完成,并且必须对所有对象都成功。
  • 在尝试在个人表上取任何锁之前,总是在全局表上取一组完整的锁。

原子预留是通过启动一个事务,然后首先更新全局清单表中的行来实现的,对于所有对象 ID,按升序排列。

没有限制的对象的更新语句如下所示:

UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET [Count] = [Count] + @QuantityToReserve
WHERE [ObjectID] = @ObjectID
Run Code Online (Sandbox Code Playgroud)

具有限制的对象的更新语句如下所示:

UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock concurrency locking sql-server-2019

-4
推荐指数
2
解决办法
285
查看次数