在谷歌搜索时,我发现了一些相互矛盾的信息。
某些站点指出,当没有为数据留下物理内存时,SQL Server 会将现有数据移动到 TEMPDB(请参阅:SQL Server:揭秘 TempDb 和建议)。
但是其他站点声明,当没有足够的物理内存时,操作系统可以使用 PAGE FILE 并将数据从物理内存移到它(请参阅SQL Server 的页面文件)。
我想知道当 SQL Server 物理内存不足时,它会在哪里写入数据?到 tempdb 还是到 OS Page 文件?或者两者都有?
在阅读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
根据最佳实践,建议将所有tempdb
(不仅仅是 tempdb)文件移动到不同的物理磁盘中。
我有一个虚拟服务器,最初有来自同一RAID 10
池的 4 个 LUN。在卷管理器的帮助下,我将这 4 个 LUN 转换为 4 个不同的卷。
现在的问题是,移动tempdb
到单独的卷中是否会产生任何影响,或者就性能而言,将它们与其他 SQL Server 文件保留在一起就可以了?
我有一个关于工作统计的问题。因此,我有一份具有以下时间表的工作:每天在上午 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 个包含不同程序和功能的数据库。到目前为止,实际应用程序只能使用 sa 帐户访问数据库,现在我想将应用程序更改为使用 sa 帐户以外的其他帐户。为此,我需要创建一个新的 SQL 登录名并为该登录名分配某些权限。有没有类似脚本的方法来确定我需要为新创建的用户分配什么权限?
stored-procedures permissions role functions sql-server-2014
我在测试 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 不同吗?
我使用 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) 我试图理解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 代理服务帐户的域帐户对该共享文件夹具有完全权限,但我的 sql 作业无法备份到共享文件夹。
除此之外,我的 sql 服务帐户使用默认虚拟登录。因此,当我将该帐户更改为我也用于 sql 代理服务帐户的域帐户时,问题就解决了。
为什么我不能使用 sql 代理服务帐户备份到共享文件夹?
sql-server ×8
jobs ×2
raid ×2
tempdb ×2
backup ×1
buffer-pool ×1
data-pages ×1
functions ×1
log-shipping ×1
maxdop ×1
memory ×1
parallelism ×1
parameter ×1
performance ×1
permissions ×1
role ×1
ssms ×1