小编Rau*_*DBA的帖子

当 SQL Server 没有可用的物理内存时会发生什么?

在谷歌搜索时,我发现了一些相互矛盾的信息。

某些站点指出,当没有为数据留下物理内存时,SQL Server 会将现有数据移动到 TEMPDB(请参阅:SQL Server:揭秘 TempDb 和建议)。

但是其他站点声明,当没有足够的物理内存时,操作系统可以使用 PAGE FILE 并将数据从物理内存移到它(请参阅SQL Server 的页面文件)。

我想知道当 SQL Server 物理内存不足时,它会在哪里写入数据?到 tempdb 还是到 OS Page 文件?或者两者都有?

sql-server data-pages memory tempdb sql-server-2014

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

为什么不建议将 RAID 5 用于日志文件?

在阅读Grant Friitchey 编写的SQL Server Query Performance Tuning 时,我发现很难理解以下部分:避免 RAID 5 用于 t-logs 因为,对于每个写入请求,RAID 5 磁盘阵列产生的磁盘 I/O 数量是比较的两倍到 RAID 1 或 RAID 10。

我知道 RAID 5 通过奇偶校验功能区别于其他 RAID。这意味着如果某些驱动器出现故障,则可以从其他驱动器恢复丢失的数据。我想了解为什么不建议将 RAID 5 用于事务日志文件。书中的解释对我来说还不够。也许有人可以向我解释或提供一篇好文章。

performance transaction-log sql-server-2014 raid query-performance performance-tuning

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

如果所有 LUN 都来自同一个 RAID 池,是否有必要将 tempdb 文件移动到不同的磁盘驱动器?

根据最佳实践,建议将所有tempdb(不仅仅是 tempdb)文件移动到不同的物理磁盘中。

我有一个虚拟服务器,最初有来自同一RAID 10池的 4 个 LUN。在卷管理器的帮助下,我将这 4 个 LUN 转换为 4 个不同的卷。

现在的问题是,移动tempdb到单独的卷中是否会产生任何影响,或者就性能而言,将它们与其他 SQL Server 文件保留在一起就可以了?

sql-server tempdb virtualisation sql-server-2014 raid

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

是否可以只使用一个共享文件夹进行日志传送?

我想知道是否可以使用一个共享文件夹(仅在源数据库中)而不是两个(一个在源数据库中,另一个在目标数据库中)。即 Server1 将其 t-log 备份存储在那里,Server2 将从同一文件夹中恢复这些备份。请看下面的图片来理解我的意思: 在此处输入图片说明

在此处输入图片说明

sql-server ssms log-shipping sql-server-2014

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

为什么作业的 next_run_time 是错误的?

我有一个关于工作统计的问题。因此,我有一份具有以下时间表的工作:每天在上午 12:00:00 到晚上 11:59:59 之间每 5 分钟发生一次。时间表将于 2017 年 12 月 13 日开始使用。

在 2019-10-20 上午 11:27 我运行了两个脚本来获取 last_run_time 和 next_run_time,下面是脚本及其对应的结果:

USE msdb
GO
SELECT J.Name                     AS 'Job Name'
         ,'Job Enabled' =        
          CASE J.Enabled
                 WHEN 1 THEN 'Yes'
                 WHEN 0 THEN 'No'
          END
         ,STUFF(
          STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
          , 8, 0, '-')                   AS 'Job Schedule Start Date'
         ,STUFF(
          STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
          , 8, 0, '-')                   AS 'Job Schedule End Date'
         ,'Job Frequency' =
          CASE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-agent jobs scheduled-tasks sql-server-2014

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

如何确定需要为新创建的登录分配哪些权限?

我们有 4 个包含不同程序和功能的数据库。到目前为止,实际应用程序只能使用 sa 帐户访问数据库,现在我想将应用程序更改为使用 sa 帐户以外的其他帐户。为此,我需要创建一个新的 SQL 登录名并为该登录名分配某些权限。有没有类似脚本的方法来确定我需要为新创建的用户分配什么权限?

stored-procedures permissions role functions sql-server-2014

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

查询执行时使用了多少线程?

我在测试 SQL Server 2014 上安装了 AdventureWorks2014 数据库。我计划执行以下查询:

SELECT *
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style
Run Code Online (Sandbox Code Playgroud)

在实际执行之前,我有我的工作线程的以下图片:

在此处输入图片说明

在查询执行时,我再次检查了工作线程的状态:

在此处输入图片说明

如您所见,第二张图片中的 active_workers_count 总数高于第一张屏幕截图中的总数。从第二个屏幕截图中,我可以假设查询执行所需的总工作线程为 1+2+1+2=6。但是,当我查看执行计划中索引扫描运算符的属性时,我看到:

在此处输入图片说明

似乎我的并行度为 4,这意味着 4 个线程正在并行处理行。

我很困惑,无法确定在查询执行期间运行了多少线程。有人可以向我解释为什么 active_workers_count 与 DOP 不同吗?

sql-server parallelism maxdop sql-server-2014

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

如何使用扩展事件捕获运行时参数?

我使用 rpc_completed 事件来捕获执行的 sproc。我也是通过以下方式查看语句和传递的参数:

右键扩展事件 -> Watch Live Data 最后看到语句+参数

但是我想以表格格式查看捕获的数据,但我无法实现它。当我在查询下运行时,它显示没有参数的语句。如何查看表格中的参数?需要你的建议。

IF OBJECT_ID('tempdb..#capture_waits_data') IS NOT NULL
DROP TABLE #capture_waits_data
SELECT CAST(target_data as xml) AS targetdata
INTO #capture_waits_data
FROM sys.dm_xe_session_targets xet
JOIN sys.dm_xe_sessions xes
ON xes.address = xet.event_session_address
WHERE xes.name = 'LongRunningQueries'
AND xet.target_name = 'ring_buffer';
--*/
/**********************************************************/
SELECT
CONVERT(datetime2,SWITCHOFFSET(CONVERT(datetimeoffset,xed.event_data.value('(@timestamp)[1]', 'datetime2')),DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS datetime_local,
xed.event_data.value('(@name)[1]', 'varchar(50)') AS event_type,
xed.event_data.value('(data[@name="statement"]/value)[1]', 'varchar(max)') AS statement,
xed.event_data.value('(data[@name="duration"]/value)[1]', 'bigint')/1000 AS duration_ms,
xed.event_data.value('(data[@name="physical_reads"]/value)[1]', 'bigint') AS physical_reads,
xed.event_data.value('(data[@name="logical_reads"]/value)[1]', 'bigint') AS logical_reads
FROM #capture_waits_data
CROSS APPLY targetdata.nodes('//RingBufferTarget/event') AS xed …
Run Code Online (Sandbox Code Playgroud)

sql-server extended-events parameter

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

物理读取和预读读取之间的区别

我试图理解read-ahead reading,但对我来说似乎有点复杂。我在网上搜索并得到以下信息:

阅读页面(微软文档):

预读预期完成查询执行计划所需的数据和索引页,并在查询实际使用这些页之前将它们放入缓冲区缓存。

从对为什么在 SQL Server 中首次执行查询时“物理读取”少于“预读”和“逻辑读取”的回答作者:huntharo 在 Stack Overflow 上:

物理读取 - 查询被阻塞,等待页面从磁盘读取到缓存中以供立即使用。

Read-Ahead Read - 页面在阻塞查询之前被读取,并像所有读取一样被读入缓存。当您扫描索引时,预读是可能的,在这种情况下,可以假定索引中的下一个叶页是需要的,并且可以在查询实际表示需要它们之前为它们启动读取。这允许磁盘在 db 引擎检查先前获取的页面的内容时忙碌。

也许有人可以使用他们自己的解释来澄清上述内容,因为我找不到预读的详细解释。

举个例子,看看statistics io信息:

Table 'TestLarge'. Scan count 1, logical reads 159185, physical reads 348, read-ahead reads 159209
Run Code Online (Sandbox Code Playgroud)

sql-server database-internals sql-server-2012 buffer-pool

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

无法备份到共享文件夹

需要你的帮助。尽管运行 sql 代理服务帐户的域帐户对该共享文件夹具有完全权限,但我的 sql 作业无法备份到共享文件夹。

除此之外,我的 sql 服务帐户使用默认虚拟登录。因此,当我将该帐户更改为我也用于 sql 代理服务帐户的域帐户时,问题就解决了。

为什么我不能使用 sql 代理服务帐户备份到共享文件夹?

在此处输入图片说明

在此处输入图片说明

sql-server backup sql-server-agent jobs

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