标签: sql-server

在哪里学习 SQL Server Service Broker?

是否有学习 Service Broker 的好资源?我正在寻找对新手友好的指南。

sql-server service-broker sql-server-2012

16
推荐指数
2
解决办法
2372
查看次数

Transaction Log 不会收缩,DB 认为它在复制

我有一个运行 Kaspersky Security Center 的 SQL Server 2008 R2 Express 数据库,我不知道安装是在什么情况下发生的,但数据库似乎认为它正在被复制并且不会从事务日志中释放任何空间。例如:

USE master;

SELECT 
    name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
FROM 
    sys.databases 
WHERE 
    name = 'KAV';

SELECT DATABASEPROPERTYEX('KAV', 'IsPublished');
Run Code Online (Sandbox Code Playgroud)

返回:

name | log_reuse_wait | log_reuse_wait_desc | is_cdc_enabled
-----|----------------|---------------------|---------------
KAV  | 6              | REPLICATION         | 0 
Run Code Online (Sandbox Code Playgroud)
DATABASEPROPERTYEX('KAV', 'IsPublished')
----------------------------------------
0 [not published]
Run Code Online (Sandbox Code Playgroud)

ReplicationSSMS的部分中也没有列出任何内容。

到目前为止,我已经尝试了从 Google 结果中收集到的几个语句:

USE KAV;
EXEC sp_repldone null, null, 0,0,1;
EXEC sp_removedbreplication KAV;
Run Code Online (Sandbox Code Playgroud)

但是我没有运气让这个数据库停止认为它正在被复制。

完整sys.databases信息:

USE master;

SELECT 
    name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
FROM 
    sys.databases 
WHERE 
    name = …
Run Code Online (Sandbox Code Playgroud)

replication sql-server transaction-log

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

由于 WHERE 子句中有超过 100,000 个条目,SQL Server 错误 8632

我的问题(或至少是错误消息)与查询处理器耗尽内部资源非常相似- 非常长的 sql query

我的客户正在使用 SQL 选择查询,其中包含一个恰好包含 100,000 个条目的 where 子句。

查询失败,错误 8632 和错误消息

内部错误:已达到表达式服务限制。请在您的查询中寻找潜在的复杂表达式,并尝试简化它们。)

我发现抛出此错误消息非常奇怪,正好是 100,000 个条目,所以我想知道这是否是一个可配置的值。是这种情况吗?如果是,我怎样才能将此值增加到更高的值?

MSDN 上,有人提议重新编写查询,但我想避免这种情况。

同时我发现我正在谈论的条目列表包含自然数,其中相当一部分似乎是连续的(例如 (1,2,3,6,7,8,9,10,12, 13、15、16、17、18、19、20)。

这使得 SQL where 子句类似于:

where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Run Code Online (Sandbox Code Playgroud)

我可以将其转换为:

where (entry between 1 and 3) OR
      (entry between 6 and 10) OR
      (entry between 12 and 13) OR
      (entry between 15 and 20)
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式缩短:

where entry in (1,...,3,6,...,10,12,13,15,...,20)
Run Code Online (Sandbox Code Playgroud)

......或类似的东西?(我知道这是一个长镜头,但它会使软件更新更容易和更易读)

供您参考: where 子句中的数据是在另一个表上完成的计算结果:首先在开始时读取并过滤该表的条目,然后进行一些额外的处理(这是不可能使用的SQL),额外处理的结果是更多的过滤,并且结果用于 where 子句中。由于无法在 SQL 中编写完整的过滤,因此使用了上述方法。显然, where 子句的内容可能会在每次处理时发生变化,因此需要动态解决方案。

sql-server configuration limits

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

SQL Server 2019 企业版和标准版之间的任务调度是否存在差异?

工作原理:SQL Server 2012 数据库引擎任务计划中,Bob Dorr 解释了 SQL Server 2012 中工作调度程序分配的一些更改。他提到一些改进仅在企业版中可用。这些差异在 SQL Server 2019 中是否仍然存在?

如果这很重要,我会问这个问题,因为我发现 SQL Server 2017 标准版实例上可能存在调度程序效率低下的问题,该实例计划未来升级到企业版。如果升级到企业版可以解决问题,我不想尝试对标准版进行调查。

sql-server database-internals sql-server-2019

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

禁用索引的用例是什么?

我刚刚了解到可以在表上禁用索引。甚至可以禁用聚集索引。此后,用户将无法访问索引或聚集索引中的数据。我们什么时候会禁用索引?我只是不明白用例。

index sql-server

16
推荐指数
3
解决办法
2998
查看次数

为什么 SQL Server 安装程序在此推荐 MAXDOP 8?

我在 AWS i3.16xlarge 上运行 SQL Server 2022 RC1 设置,具有 2 个插槽、2 个 NUMA 节点、每个节点 32 个逻辑处理器、总共 64 个逻辑处理器。

安装程序推荐 MAXDOP 8:

SQL Server 设置和任务管理器

但是,如果您单击该链接来配置 MAXDOP,建议会显示:

MAXDOP 建议

根据那篇知识库文章,MAXDOP 应该是 16,而不是 8。当然,从技术上讲,8 小于 16 - 但 2、4 或 15 也是如此。8 从哪里来?

SQL Server 安装完成且服务启动后,日志显示 SQL Server 自动实施具有 4 个节点的 Soft-NUMA,每个节点有 16 个逻辑处理器:

SQL Server 错误日志

同样,这表明 MAXDOP 应为 16。

这是一个错误,还是我错过了一些明显的事情?是否还有另一个不成文的规则,设置将在 MAXDOP 8 处停止?

sql-server configuration maxdop numa sql-server-2022

16
推荐指数
2
解决办法
2731
查看次数

在手写代码中使用 SQL Server 的括号表示法有意义吗?

当代码生成器使用新的 Microsoft 括号表示法 ( []) 为几乎所有内容生成输出时,它们往往更简单。

当我第一次看到它时,我虽然哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇当时有些禁止引用的标识符符号表示法被禁止引用的标识符符号的转世。

据我所知,它是 Microsoft 的专有扩展(意味着 Oracle 不支持它)。

查看 SQL Server,如果您定义一个表,则没有区别

CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]);
Run Code Online (Sandbox Code Playgroud)

或者

CREATE TABLE dbo.Table_2 (col1 int, col2 int);
Run Code Online (Sandbox Code Playgroud)

这是个人或公司风格的问题。始终如一。

现在,如果您想将数据库迁移到 Oracle,括号是没有选择的。

您可以使用旧的带引号的标识符,但这些标识符区分大小写,这会导致很多麻烦。

从生成的代码中删除所有括号、避免使用空格、其他特殊字符和保留关键字作为名称,并且仅以大多数 DBMS 理解的方式进行编码是否是个好主意?

sql-server style t-sql

15
推荐指数
5
解决办法
1万
查看次数

SQL Server VARCHAR 列宽

在网上搜索,我发现在指定过宽的 VARCHAR 列时是否会影响性能的建议相互矛盾,例如 VARCHAR(255) 时 VARCHAR(30) 可能会这样做。

我一致认为,如果整行超过 8060 字节,性能会受到影响。除此之外,我看到了分歧。

索赔是真的The default is SET ANSI PADDING ON = potential for lots of trailing spaces吗?只要总行宽小于 8060,过大的 VARCHAR 列是否有任何真正的性能问题?

列宽很重要的证据


The same goes for CHAR and VARCHAR data types. Don’t specify more characters in character columns that you need.

http://www.sql-server-performance.com/2007/datatypes/


  • Length is a constraint on the data (like CHECK, FK, NULL etc)
  • Performance when the row exceeds 8060 bytes
  • Can not have unique constraint or index (key column width must …

sql-server-2008 sql-server varchar

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

对单个数据库的 BULK INSERT 权限

我在一家拥有直接 IT 安全方式的公司工作。我被聘为数据库分析师是为了优化我们团队中的一些流程。问题是我只有读写权限,我正在努力获得数据库的高级权限。目前我们在一台服务器上有很多数据库,我们只能在一个数据库上工作,我想知道是否BULK INSERT可以将权限授予单个数据库还是整个服务器的权限?

我已经通过网络搜索了这个,但我有点困惑。这是我发现的。为了使用 BULK INSERT,我应该拥有INSERT所需表或数据库的权限,并且ADMINISTER BULK OPERATIONS这是服务器范围的权限。如果我获得了ADMINISTER BULK OPERATIONS对整个数据库的INSERT权限和对单个数据库的权限,我是否只能BULK INSERT在该单个数据库中执行此操作,因为我没有INSERT对其他数据库的权限?

是否可以将使用限制为BULK INSERT具有多个数据库的服务器上的单个数据库?

对不起文字墙,谢谢!

sql-server-2008 sql-server

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

如何从在主键上返回多行的连接中选择第一行

这与这个问题有关: Joining multiple tables results in duplicate rows

我有两个要加入的表。他们共用一个钥匙。person 表的每个主键有一个名称,而 email 表的每个 personId 有多个电子邮件。我只想显示每个人的第一封电子邮件。目前我每人收到多行,因为他们有多封电子邮件。我正在运行 SQL-Server 2005。

编辑:这是 T-SQL。第一封电子邮件实际上是每个人的第一封电子邮件行。

编辑 2:我看到的第一封电子邮件将是在 SQL 通过查询工作时显示在联接中的第一封电子邮件行。我不管出现哪个电子邮件。只是显示不超过一封电子邮件。我希望这能让它更清楚。

Table1: Person
Table2: Email

Select Person.PersonName, Email.Email
From person 
left join on Person.ID=Email.PersonId;
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server greatest-n-per-group

15
推荐指数
4
解决办法
10万
查看次数