标签: sql-server

IO_STALL 问题和理解

我每 5 分钟从 sys.dm_io_virtual_file_stats 收集 IO_STALLS,然后进行增量以查看哪些文件受 IO 影响最大。

在一个 5 分钟的时间内,我得到了 5826331 毫秒的增量,即 97 分钟。

我对此有点困惑,这是说 97 分钟前开始的操作仅在那时完成并因此记录了等待时间?

谢谢

根据要求添加代码:

/*

USE [SysDBA]
GO
*/
/****** Object:  Table [dbo].[DISKIOPS]    Script Date: 04/07/2013 11:40:15 ******/
/*
DROP TABLE [dbo].[DISKIOPS]
GO
*/
--Create the table
/****** Object:  Table [dbo].[DISKIOPS]    Script Date: 04/07/2013 11:40:15 ******/
/*
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[DISKIOPS](
    [IO_STALL] [bigint] NULL,
    [IO_STALL_READ_MS] [bigint] NULL,
    [IO_STALL_WRITE_MS] [bigint] NULL,
    [NUM_OF_READS] [bigint] NULL, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

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

函数因空大小写操作而挂起

我创建了一个接受开始和结束日期的函数,结束日期是可选的。然后我CASE在过滤器中写了一个,如果没有通过结束日期,则使用开始日期。

CASE WHEN @dateEnd IS NULL
    THEN @dateStart
    ELSE @dateEnd
END
Run Code Online (Sandbox Code Playgroud)

当我为最近一个月的数据调用函数时:

SELECT * FROM theFunction ('2013-06-01', NULL)
Run Code Online (Sandbox Code Playgroud)

...查询挂起。如果我指定结束日期:

SELECT * FROM theFunction ('2013-06-01', '2013-06-01')
Run Code Online (Sandbox Code Playgroud)

... 结果正常返回。我从函数中取出代码并在查询窗口中正常运行。我也不能复制小提琴的问题。像这样的查询:

SELECT * FROM theFunction ('2013-04-01', '2013-06-01')
Run Code Online (Sandbox Code Playgroud)

...也工作正常。

查询(下面)中是否有任何内容可能导致函数NULL在结束日期传递时挂起?

SQL小提琴

  • 执行计划SELECT * FROM theFunction ('2013-06-01', '2013-06-01')
  • 预计计划SELECT * FROM theFunction ('2013-06-01', NULL)

sql-server sql-server-2008-r2

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

跟踪标志以及哪些需要关闭以及为什么

在 SQL Server 中,有很多跟踪标志。为什么其中一些需要关闭。在某些地方我看到需要关闭跟踪标志 8017。所以我想知道需要关闭哪个跟踪标志,为什么?

performance sql-server maintenance sql-server-2008-r2 trace

9
推荐指数
2
解决办法
4799
查看次数

SQL SERVER 2012 中的 TABLESAMPLE(10) 和 TABLESAMPLE(10 PERCENT) 有什么区别

我对 TABLESAMPLE 的使用的理解是它返回结果集中前 n% 的行,其中 TABLESAMPLE(n)

所以我写了以下查询来检查(因为我正在学习 T-SQL)

SELECT FirstName,
       MiddleName,
       LastName
FROM Person.Person TABLESAMPLE(10)

SELECT FirstName,
       MiddleName,
       LastName
FROM Person.Person TABLESAMPLE(10 PERCENT)
Run Code Online (Sandbox Code Playgroud)

每次执行查询时,每个查询都会返回不同数量的行。

所以我显然不理解TABLESAMPLE。有人能解释一下吗?

sql-server t-sql

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

更改跟踪内部结构是否从 SQL Server 2008 更改为 2012?

在解决将断开连接的设备与中央数据库服务器同步的问题时,我们在服务器上升级到 SQL Server 2012 后遇到了问题。看起来 CHANGE_TRACKING_MIN_VALID_VERSION 返回的值比它应有的值高 1(或至少比升级前的值高)。

我一直在研究如何设置简单示例的Arshad Ali 的精彩示例。

我已经运行了从 #1 到 #5 的脚本,以在 SQL Server 2008 和 2012 环境中的 Employee 表中插入、删除和更新一行。

在 2008 年,以下语句返回 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))
Run Code Online (Sandbox Code Playgroud)

在 2012 年,它返回 1。

在测试中通过更多脚本 (6-8) 工作时,我将保留期设置为 1 分钟,以期强制执行清理操作。我离开了一天,显然它运行了一夜。

在 2008 年的实例中,CHANGE_TRACKING_CURRENT_VERSION 和 CHANGE_TRACKING_MIN_VALID_VERSION 是相等的 (11)。在 2012 年的实例中,CHANGE_TRACKING_MIN_VALID_VERSION 比 CHANGE_TRACKING_CURRENT_VERSION (11) 高一 (12)。当数据库长时间空闲时,这可能会对同步过程产生影响。我们发现进程可能会陷入循环,尤其是在执行以下测试以确定是否需要重新初始化而不是同步时:

IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Employee')) > @sync_last_received_anchor 
       RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''...
Run Code Online (Sandbox Code Playgroud)

有没有其他人经历过这种行为变化?有人有解释吗?

sql-server sql-server-2012 change-tracking

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

如何删除当前正在使用和处于单用户模式的 SQL Server 数据库

我在 SQL Server 2008 上有一个数据库,我想删除它。目前它处于单用户模式并且正在使用中。

select * from sys.sysprocesses
Run Code Online (Sandbox Code Playgroud)

返回

Msg 924, Level 14, State 1, Line 1
Database 'G_MAIN_DE' is already open and can only have one user at a time.
Run Code Online (Sandbox Code Playgroud)

我不知道如何识别我必须杀死的会话。

尝试将其设置为离线

ALTER DATABASE G_MAIN_DE SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

产量

Msg 5064, Level 16, State 1, Line 1
Changes to the state or options of database 'G_MAIN_DE' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it. …
Run Code Online (Sandbox Code Playgroud)

sql-server

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

使用共享登录时,如何知道用户对审计表执行删除操作?

背景资料:

  • 我正在创建一组审计表,以跟踪我的应用程序对一组数据表的更新和删除。
  • 审计记录是通过触发器创建的。
  • 我的应用程序数据库中的 DML 通常来自服务用于进入数据库的登录名。因此,我认为SYSTEM_USER在触发器中调用时,结果总是相同的。
  • 我的应用程序当前不存储用户数据,尽管UserId每次完成 DML 时都会为其提供一个字符串(仅在存储过程中完成)。

我遇到的问题是,当用户删除记录时,我想知道是谁做的。因为它将通过相同的登录完成,我不想看到所有操作都是由服务完成的,我想看看是哪个用户完成的。这不是更新的问题,因为我们有ModifiedBy将通过发送的UserId更新来更新的列。

问题是:有没有办法在SYSTEM_USER运行删除时设置或以其他方式将用户信息放入触发器中?

我现在拥有的“最佳”想法,虽然我不确定这是否是一个好主意,但在服务中,我检查当前UserId是否以用户身份存在于数据库中,如果没有,则创建一个用户为他们反对。然后运行存储过程EXECUTE AS User = @UserId。然后当 DML 在存储过程中完成并且触发器触发时,SYSTEM_USER应该从EXECUTE AS.

trigger sql-server audit azure-sql-database users

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

数据类型大于 bigint

我想使用可以容纳超过 19 位数字的数据类型。那么是否有任何可用的数据类型可以容纳大于 19 位的数字?

sql-server datatypes sql-server-2008-r2

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

在 SQL Server 代理中运行 Powershell 脚本时出错

我有一个通过 SQL Server 代理(运行 SQL Server 2012 Enterprise)运行的 SQL 作业。作业的最后一步是运行位于网络共享上的应用程序。不幸的是,我不知道应用程序所在文件夹的名称(文件夹是版本号),所以我使用 PowerShell 来查找它:

set-location "\\server\companydocuments\MyApp\Application Files\"
$name = Get-ChildItem | sort name -desc | select -f 1 | select name
cd $name.name
& ".\Application.exe"
Run Code Online (Sandbox Code Playgroud)

如果我在 SQL Server 上打开一个 PowerShell 窗口,那么它工作正常。当我在 SQL Server 代理中运行它时,出现以下错误:

A job step received an error at line 1 in a PowerShell script.
The corresponding line is 'set-location "\\server\companydocuments\MyApp\Application Files\'"
Run Code Online (Sandbox Code Playgroud)

我认为这可能是权限问题,所以我尝试在我的凭据下运行 SQL Server 代理(它是测试服务器,而不是生产服务器),但我仍然遇到相同的错误。我还尝试将网络驱动器映射到共享文件夹而不是 UNC 路径,但出现相同的错误。

谁能建议我如何连接到这个文件夹?

sql-server powershell sql-server-2012 sql-server-agent jobs

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

SQL 中的最小日志记录条件

我已经编写了一个脚本来测试在这个页面http://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx中标题为 Summarizing Minimal Logging conditions about when最小日志记录发生或不发生。

使用此脚本,我发现每种不同类型插入的日志记录长度总和如下:

  • 堆为空 没有块 60000
  • 堆为空,带有 tabblock 56000
  • Heap non empty no tabblock 60000
  • 堆非空,带有 tabblock 56000
  • 堆加索引为空 无标签块 126188
  • 堆加索引为空,带有 tabblock 114188
  • 堆加索引非空无标签块 138696
  • 堆加索引非空,带有 Tablock 112000
  • 集群空有序无标签 64168
  • 簇为空,用 tabblock 56168 排序
  • 集群空无序无标签块 73388
  • 集群空无序,带有 tabblock 65388
  • 集群非空无标签块 63912
  • 集群非空,带有 tabblock 55944
  • 簇加索引为空 无标签块 124336
  • 簇加索引为空,带有 tabblock 108336
  • 集群加索引非空无标签块 123876
  • 带有标签块的集群加索引非空 107924

其中一些数字似乎与 technet 页面上的表格不符。特别是:

  • 插入空表和非空表之间的日志记录似乎没有区别,但是该页面声称在插入到没有 tabblock 的非空集群时应该有完整的日志记录
  • 使用 Tablock 插入带有和索引的堆或集群似乎确实减少了日志记录,但该页面声称应该有完整的日志记录。
  • 使用insert的SELECT INTO方法时,fn_dblog中没有行是insert操作,但是页面把这个方法列为批量加载操作,应该有表中描述的行为

作为参考,这是在 SQL express 数据库上运行的,当我运行 DBCC TRACESTATUS (610) …

sql-server-2008 sql-server bulk-insert

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