在 SQL 语句中使用三部分名称是一种很好的做法,它也有助于对象识别和性能改进。它还可以帮助实现许多其他目的,例如如果您想使用相同的 T-SQL 语句将 SP、查看函数移动到不同的数据库。
因此,我想创建一个策略,强制开发人员在创建 SP、视图和函数时使用“三部分命名”。
SQL Server 2016 中是否有任何内置策略或方法可以帮助我?
回复将不胜感激..:)
有没有一种方法可以在不使用 TSQL 语言中的 sp_MSForEachTable 的情况下截断数据库中的所有表?背景:不是我的电话,DBA公司政策不允许sp_MSForEachTable。
EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'
Run Code Online (Sandbox Code Playgroud)
想知道这是否是最有效的方法,还是其他可用的选择?
select 'truncate table ' + Table_Schema + '.' + Table_Name from INFORMATION_SCHEMA.tables where table_type = 'base table'
Run Code Online (Sandbox Code Playgroud)
另一个网站建议这样做: https: //www.mssqltips.com/sqlservertip/3218/truncate-all-tables-in-a-sql-server-database/
/* TRUNCATE ALL TABLES IN A DATABASE */
DECLARE @dropAndCreateConstraintsTable TABLE
(
DropStmt VARCHAR(MAX)
,CreateStmt VARCHAR(MAX)
)
/* Gather information to drop and then recreate the current foreign key constraints */
INSERT @dropAndCreateConstraintsTable
SELECT DropStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema
+ '].[' + ForeignKeys.ForeignTableName + '] DROP CONSTRAINT …Run Code Online (Sandbox Code Playgroud) 在我正在处理的数据库中,有一个名为 的表,persons大约有一百万行,并且来自其他表(有些有数百万行)的 60 个 FK (FK) 约束指向它。
如果我从 中删除一行persons,则需要很多分钟,这不会是问题,但它也会使表保持锁定,从而阻止数据库的所有进程。过去,这曾导致用户报告系统宕机。
当然,如果我为所有的FK添加支持索引的话,情况会大大改善(目前60张表中只有20张有)。但是这些FK很多都是针对诸如 之类的列modified_by,因此所有索引都没有其他目的,并且会在日常操作中降低系统的性能,只有在特殊情况下才能获得改进。
在运行 DELETE 之前,我已经确保所有引用行都已被删除或更新。我手动执行此操作,因为我强烈反对使用 CASCADE。
我没有考虑软删除,因为否则我将不得不更改读取表persons以跳过已删除行的所有软件。
有没有办法(可能是暂时的)更改表的锁定机制persons,以便即使 DELETE 需要一个小时,也不会影响并发进程?
禁用 FK 可能是一种可能。风险在于,当我删除该行时,其他人会造成不一致,然后我无法重新启用 FK。
要删除的行:通常一次删除一行。手动操作或计划操作。
有趣的一点:我没有立即检查执行计划,但显然,除了引用表的 PK 上的 7 例“聚集索引扫描(Clustered)”之外,几乎所有操作的成本都是 0%;其中一种费用为 57%,另一种费用为 1% 至 16%。我仍然不明白为什么它应该扫描聚集索引。
我正在运行 SQL Server 2016 2 节点 Always On 可用性组,并且我想做一些备份。我通常运行此查询来进行备份:
-- To permit log backups, before the full database backup, modify the database to use the full recovery model.
USE master;
ALTER DATABASE dbname
SET RECOVERY FULL;
BACKUP DATABASE dbname
TO URL = 'https://bloblname.blob.core.windows.net/databasebackup/backup.bak'
WITH CREDENTIAL = 'credentialname';
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以在可用性组主节点上执行此部分操作而不会导致停机吗?
ALTER DATABASE dbname
SET RECOVERY FULL;
Run Code Online (Sandbox Code Playgroud)
我担心如果我在主要可用性组上运行此命令,它会以某种方式导致同步停止,或者可能产生其他可能有害的影响。
另一个相关问题是 - 您建议在主服务器还是辅助服务器上运行这些命令?
任何对此的帮助将不胜感激。
我的查询运行有点慢,我认为这是因为该where datediff函数。
WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
Run Code Online (Sandbox Code Playgroud)
(通过这种方法至少使用我创建的索引)
之前是这样的:
datediff(minute, TB1.stDate), '2017-01-01') <= 0)
Run Code Online (Sandbox Code Playgroud)
我想了解是否有更好的方法使用 datediff 进行过滤。
我的问题是,即使在函数内部,我的查询如何已经使用索引DATEDIFF。
我们安装了 Microsoft SQL Server 2016 Web Edition 服务器的服务器运行速度非常慢。
我们正在考虑增加其许可的核心数量。但是,我们需要检查数据库当前使用了多少个 CPU 核心。我们的 Windows Server 2016 有 16 核(双)CPU。
基本答案:我要求的东西不属于 AOAG 设计的一部分。
在我看来,这“不是一个好问题”。除非这冒犯了某人,否则我会将其保留在这里,以防万一有人有和我一样的坏主意。
请原谅我使用的术语,因为我不是 DBA。
我正在咨询一个很可能需要 700-900 个数据库的项目。该软件无法利用多个 SQL 实例,并且必须将所有数据库托管在同一 SQL 实例名称上。
客户的DBA解释了为什么在AlwaysOn可用性组上托管数百个以上的数据库可能是不合理的,并且微软官方文档虽然没有说明上限,但确实声明微软仅使用100个数据库进行测试。
AlwaysOn 故障转移群集不是一个选项,因为数据是共享的而不是复制的。
我的理解是,AOAG 可以作为 SQL 实例进行寻址,并且我无法在多个 AOAG 之间共享实例名称。
有人向我提到,也许可以做到这一点 - 添加一个额外的 AG 并将这些额外的数据库放在同一 SQL 实例名称下,但我无法通过搜索找到此选项的描述。
要么我使用错误的术语搜索相关信息,要么我假设 AG 与 SQL 实例是 1:1,甚至可能是 1:m,但每个实例都不是多个 AG。
hostname\instance没有 AOAG 的关系:
Host --1:n--> Instance --1:n--> database
Run Code Online (Sandbox Code Playgroud)
(如果我这里说错了,请纠正我)
关系?与 AOAG 一起:
AO Cluster (logical name AO\All)
+-- AG …Run Code Online (Sandbox Code Playgroud) sql-server availability-groups sql-server-2016 sql-server-2017 sql-server-2019
上一个版本发布后,我们开始面临一些不寻常的等待。XE_SERVICES_RWLOCK等待开始出现在我们的顶级等待中。调查显示这种等待发生在插入我们的主 OLTP 表期间。我们在这部分中唯一改变的是我们通过插入序列来改变插入到标识列中。实际上我们还没有从列中删除身份选项。相反,我们只是在做
SET IDENTITY_INSERT ON
INSERT STATEMENT HERE
SET IDENTITY INSERT OFF
Run Code Online (Sandbox Code Playgroud)
我们没有删除身份属性的原因是它需要重建表,但我们的表很大,需要几个小时的停机时间。问题是什么是XE_SERVICES_RWLOCK 等待,它们是否会出现在大量语句的情况下SET IDENTITY_INSERT ON|OFF,或者根情况是否可以使用sequence而不是identity?
我们sp_WhoIsActive每 30 秒运行一次并将结果保存到表中以便以后调查问题。您可以从所附表格中看到结果。
我们使用的是 SQL Server 2016 SP2。
我正在尝试将备份文件拆分为多个文件,以将它们从一个 DC 复制到另一个 DC。找不到有关最大文件数的任何信息。当我尝试将备份文件拆分为多个文件时,可以创建多少个文件?
我目前找到的唯一信息是 Ola 的备份脚本,他在其中提到了 64 个文件:
https: //ola.hallengren.com/sql-server-backup.html

sql-server-2016 ×10
sql-server ×8
backup ×2
ddl ×1
delete ×1
foreign-key ×1
identity ×1
sequence ×1
truncate ×1
waits ×1