我有一个 After Update 触发器,其中触发器在同一个表中插入一个值以查找持续时间列。我的目标是每当插入 end_time 值时,触发器将找到hh:mm:ss格式的持续时间并插入到持续时间列中。
问题-触发器导致如此多的死锁,从而阻塞了另一个进程。
列数据类型信息..
Start_time datetime, End_time datetime, Duration time(3)
ALTER TRIGGER [dbo].[GET_DURATION] ON [dbo].[INBOUND_CALL_xxx]
AFTER UPDATE AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Begin Transaction
UPDATE INBOUND_CALL_xxx
SET DURATION = convert(time(0),(END_TIME- START_TIME))
FROM INBOUND_CALL_xxx with (nolock)
Commit;
Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 sql-server sql-server-2012 performance-tuning
执行下面的查询时,如果我使用PRINT它打印正确。我可以复制并粘贴打印的代码并执行它。但是,如果我使用 EXEC,则会出现以下错误:
有没有办法简化我正在做的事情?为什么 SQLPRINT和 SQL 会EXEC提供这两种截然不同的结果集?
DECLARE @TableName as NVARCHAR(250), @SQL as VARCHAR(MAX);
DECLARE @TableCursor as CURSOR;
SET @TableCursor = CURSOR FOR
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
AND name like 'HISTORY_MasterList_%'
ORDER BY sobjects.name
OPEN @TableCursor;
FETCH NEXT FROM @TableCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL ='select '''+ @TableName +''', 0
Union All
select All ''Server Count'',count(1) from ['+ @TableName +']
Union All
select All ''Server Cores'',sum(convert(decimal(18,0),cores)) …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server t-sql sql-server-2008-r2 sql-server-2012
当我尝试在 SSMS 中执行以下查询时,由于列大小过长(列名称:关键字,列大小:nvarchar(4000)),查询需要更多时间(超过 10 分钟)来执行。员工表包含 6000 条记录。
Select EmployeeId, EmployeeName, Designation, Keywords
From Employees
Where StatusFlag = 'L'
Run Code Online (Sandbox Code Playgroud)
我为上表创建了下面的非聚集覆盖索引。
Create NonClustered Index NCI_Employees_StatusFlag On Employees(StatusFlag) Include (EmployeeId, EmployeeName, Designation, Keywords)
Run Code Online (Sandbox Code Playgroud)
如何更快地从上表中检索数据?
不知何故,它的最小大小为 32GB。
实际的数据库大小约为 2GB。
每天从外部数据源擦除和重新创建数据库,因此根本不需要任何日志,因为它每次都是从头开始重建。
也就是说,我想缩小 LDF 文件,因为它在我的开发机器的 SSD 上占用了大量空间,而且它不需要是数据库本身大小的 16 倍。
我发现我无法将日志缩小到其最小大小 32gb 以下,因此我需要更改最小大小。如果我转到数据库上的属性,我可以更改它,但是当我按 OK 时什么也没有发生。
除了编写数据库脚本以创建并删除它并使用较小的 LDF 重新制作它之外,是否还有其他命令或技术可以用来执行此操作?
我想说的是,在将 MS SQL Server 2012 Enterprise 迁移到 MS SQL Server 2012 Express 之后。我已经看到 DB 备份大小以及所有数据库的“LSN”存在一些细微的差异。
让我们从头开始一步一步地写下来。我在从 MS SQL Server 2012 Enterprise 迁移到 MS SQL Server 2012 Express 的过程中做了什么。
1) 我已于 2015 年 12 月 23 日在 MS SQL Server 2012 Enterprise 中备份了所有 3 个审计数据库。MS SQL Server 2012 企业版是
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
Oct 19 2012 13:38:57
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)
2) 从 …
我试图搜索这个并且能够找到很少但找不到确切的方法来编写数据库的数据库级别权限。
我正在迁移这个数据库,我可以使用创建其登录名sp_help_revlogin,但不会复制用户权限。
我可以使用以下查询提取权限:
SELECT
ISNULL(OBJECT_NAME(major_id),'') [Objects], USER_NAME(grantee_principal_id) as [UserName], permission_name as [PermissionName]
FROM
sys.database_permissions p
WHERE grantee_principal_id>0
ORDER BY
OBJECT_NAME(major_id), USER_NAME(grantee_principal_id), permission_name
Run Code Online (Sandbox Code Playgroud)
但是我需要像 rev login 这样的东西来生成一个脚本,你可以执行来获取权限映射。
我尝试过 DBAtools,但我无法使用,因为它失败并出现错误
无法找到类型 [DbaInstanceParameter]
我有 50 多个登录名和大约 20 个要复制的角色。
当我在不指定 ldf 文件的情况下运行此查询时,它会自动创建 ldf 文件。
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max)
set @query = '
CREATE DATABASE ' + @DBname + '
ON
( NAME = ' +@DBname+',
FILENAME = '''+@path+'\'+@DBname+'.mdf'+''',
SIZE = 1024,
MAXSIZE = unlimited,
FILEGROWTH = 500 )
'
exec (@query)
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个查询时:
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max)
set @query = '
CREATE DATABASE ' + @DBname + '
ON
( NAME = …Run Code Online (Sandbox Code Playgroud) 使用 Demo from here重现我的问题,更改表结构如下,并将演示分区函数修改为 datetime
CREATE TABLE [dbo].[DemoPartitionedTable](
[DemoID] [int] IDENTITY(1,1) NOT NULL,
[SomeData] [sysname] NOT NULL,
[CaptureDate] [datetime] NULL,
CONSTRAINT [PK_DemoPartitionedTable] UNIQUE NONCLUSTERED
(
[DemoID] ASC,
[CaptureDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
Run Code Online (Sandbox Code Playgroud)
用户运行如下查询(查询 1)
SELECT [DemoID], [SomeData], [CaptureDate] FROM
[dbo].[DemoPartitionedTable] WHERE (1=1) and (1=1) and
CONVERT(varchar(10),CaptureDate,112) between 20190912 and 20190912
Run Code Online (Sandbox Code Playgroud)
计划是https://www.brentozar.com/pastetheplan/?id=r1veZhovH
大约需要 4 小时才能返回 500 万行
如果我使用如下分区键来改进上面的代码(查询 2)
SELECT [DemoID], [SomeData], [CaptureDate] FROM …Run Code Online (Sandbox Code Playgroud) performance sql-server partitioning sql-server-2012 query-performance performance-tuning
我有一个带有此配置的表:
现在,如果您查看 COLUMN_11,它是一个 varchar -1。
但据我所知,要将 PDF 文件插入表中,您需要文件流,并且列应该是 VARBINARY(max) 对吗?
那么,这是如何运作的呢?为什么 VARCHAR 列中有 PDF?
DocumentBody 是这样的:
显然,这样的数量有数百万。
我想将一列从 转换varchar(50)为bigint或int。
SQL Server 2012中表有20亿条数据有什么缺点?
数据长度为 11,数据只有数字。它们被存储为 varchar。现在我必须为它创建索引。所以我想我必须转换int为创建索引。该表没有约束和索引。目前没有人使用那张桌子。例如:
data
-----
12345678911
12345678915
12345678911
12345678911
12345678914
12345678913
12345678912
Run Code Online (Sandbox Code Playgroud) sql-server-2012 ×10
sql-server ×7
performance ×2
t-sql ×2
alter-table ×1
backup ×1
filestream ×1
partitioning ×1
permissions ×1
restore ×1
scripting ×1