运行以下查询时:
-- DATEADD (datepart , number , date )
DECLARE @dt DATETIME
SELECT @dt = DATEADD(month,-6,getdate())
select @dt
EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @dt
Run Code Online (Sandbox Code Playgroud)
我收到很多锁和块,可能是因为该命令已经有一段时间没有运行了(如果有的话)。
在我实际运行或计划运行此命令之前,有没有办法找出每个涉及的表中有多少要删除的内容?
我使用dateadd来计算 6 个月。
在sp_delete_backuphistory中,以下表被修剪:
sp_delete_backuphistory 必须从 msdb 数据库运行并影响以下表:
备份文件
备份文件组
备份媒体家族
备份媒体集
备份集
恢复文件
恢复文件组
恢复历史
所以数据库管理不是我的强项,所以我有几个问题。
这一切都与我正在查看的网站的性能有关,并且花了很多时间进行研究/诊断。
我注意到实时站点上的页面加载时间比测试站点要长得多。
测试站点的规格非常低 - VPS 2 虚拟处理器,14GB RAM 和 SQL + 网站在同一 VPS 上运行
直播网站的规格为 4 台专用服务器,均配备 8 个虚拟处理器和 16GB RAM
实时站点使用单独的 SQL 专用服务器,具有 16 个虚拟处理器和 112GB RAM
该网站在任何时候平均有 120 个并发用户,但可以在 70 到 150 之间波动,当我们发送电子邮件活动时,它可以达到 400。当我们达到 400 时,CPU 可以达到 100%,这取决于用户的操作正在网站上做,但它们与 RAM 保持相当好。
我希望实时网站实际上比测试网站执行得更快,但事实并非如此。我已经查看了代码,但我坚信这是由于数据库造成的。备份时直播网站的数据库大小超过50GB,测试站点为4GB。
两个数据库都非常碎片化,我想知道碎片化影响性能的可能性有多大?
也因为直播网站比测试网站大很多倍,那么高碎片化对直播网站性能的影响会比测试网站大很多吗?
因为我以前从未处理过这个关于重建/刷新索引的一些技巧。
我是否应该将网站置于维护模式,以便在我重建/刷新索引时没有人可以与表交互?
一个有 12 个索引和 40000 个产品的表需要多长时间?
谢谢
performance index sql-server fragmentation index-maintenance
我有一个位于意大利的链接服务器,server_italia它连接到位于美国俄勒冈州的服务器ORDB1
我们在不同但受信任的域上。
从连接server_italia到ORDB1通过链接服务器使用具有登录和所要求的权限的SQL Server的帐户进行ORDB1。
我是一个sysadmin甚至domain admin在我的域中,而我的server_italia但我只sysadmin在 .sql server 中ORDB1。
有一个类似的问题:
但它没有提供the答案。
这是我的链接服务器:
当我运行以下查询时,server_italia我得到以下结果:
SELECT [the_server]=@@servername,
auth_scheme
FROM sys.dm_exec_connections WHERE session_id = @@spid ;
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
Run Code Online (Sandbox Code Playgroud)
在俄勒冈州,我得到了这个:
如果我的美国同事得到:
在他们的服务器上设置 Kerberos 身份验证
配置约束委派,因为这将允许传递凭据,否则您可能仍会遇到双跳问题。– 在John Eisbrener的评论中添加
我可以在linked …
每次我需要恢复数据库或重新初始化复制发布时,我首先(在恢复的数据库或订阅数据库上)我编写所有权限、触发器、索引、同义词,有时还编写统计信息
然后我执行还原或(应用快照),然后在还原的数据库上重新应用我保存的脚本。
我有一些 LIVE 服务器,其中db_denydatawriter已被大量使用,尽管我拥有以前的所有权限,但由于db_denydatawriter还原附带(因为它处于活动状态),新还原的数据库现在拥有它。
它会导致问题。
以至于现在我有了这个脚本(使用sp_foreachdb)只是为了在测试中删除它:
declare @db_list NVARCHAR(MAX)
SELECT @db_list = STUFF((
SELECT ', ' + name FROM sys.databases
WHERE name NOT IN ('DBA','TABLEBACKUPS','MASTER','MSDB','MODEL','TEMPDB','distribution')
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
SELECT [@db_list] =@db_list
exec sp_foreachdb @database_list = @db_list
,@exclude_list = 'dba,tablebackups,master,msdb,model,tempdb'
,@command='use ?;begin try EXEC sp_droprolemember @rolename = [db_denydatawriter], @membername = [mycompany\Developers] end try begin catch end …Run Code Online (Sandbox Code Playgroud) 我有一个res_users带有主键的表id
我想列出id数据库中所有表的所有外键链接。
我喜欢在旅途中查找丢失的索引,查看执行计划!
如果我想改进当前正在运行的东西,它可能会给我一个进一步的指示。
为此,我使用以下查询:
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type,
er.wait_time,
er.last_wait_type,
er.granted_query_memory,
er.reads,
er.logical_reads,
er.writes,
er.row_count,
er.total_elapsed_time,
er.cpu_time,
er.open_transaction_count,
er.open_transaction_count,
s.text,
qp.query_plan,
logDate = CONVERT(DATETIME,GETDATE()),
logTime = CONVERT(DATETIME,GETDATE())
FROM sys.dm_exec_requests er
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s
CROSS APPLY sys.dm_exec_query_plan(er.plan_handle) qp
WHERE
CONVERT(VARCHAR(MAX), qp.query_plan) LIKE '%<missing%'
Run Code Online (Sandbox Code Playgroud)
它通常工作正常;但是,我最近遇到了整理和 XML 的问题:
错误信息说:
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type, …Run Code Online (Sandbox Code Playgroud) 我有以下查询:
SELECT u.userId,
app.applicationId
FROM app.application AS app
INNER JOIN app.applicant AS ap
ON ap.applicantId = app.applicantId
INNER JOIN usr.[user] AS u
ON u.userId = ap.userId
LEFT JOIN msg.emailTemplateSent AS t
ON t.toUserId = u.userId
AND t.emailTemplateName = 'v4_before_sixWeek_latestFlight_reminder'
WHERE Convert(Date, GETUTCDATE()) =
DATEADD(week,-6,Convert(Date, app.flightDateLatest ))
AND t.emailEventId IS NULL
ORDER BY app.applicationId ASC
Run Code Online (Sandbox Code Playgroud)
请再次注意where子句的第一行:
Convert(Date, GETUTCDATE()) = DATEADD(week,-6,Convert(Date, app.flightDateLatest ))
Run Code Online (Sandbox Code Playgroud)
我可以以可以使用我的索引的方式更改此设置吗?索引实际上被使用了,但它是一个完整的扫描。
也可以在这里看到:
这是我的索引定义:
USE [APCore];
CREATE NONCLUSTERED INDEX i_flightDateLatest
ON [app].[application] ( flightDateLatest ASC )
INCLUDE ( [applicantId] , …Run Code Online (Sandbox Code Playgroud) index sql-server execution-plan sql-server-2016 query-performance
我有一个无法杀死的顽固 spid,它阻止了我的 tempdb的事务日志被截断
这就是我发现这个流氓 spid 的方法:
if object_id('tempdb..#OpenTranStatus','U') is not null
drop table #OpenTranStatus
CREATE TABLE #OpenTranStatus (
ActiveTransaction varchar(25),
Details sql_variant
);
-- Execute the command, putting the results in the table.
INSERT INTO #OpenTranStatus
EXEC ('DBCC OPENTRAN (sqlwatch) with tableresults')
SELECT * FROM #OpenTranStatus
Run Code Online (Sandbox Code Playgroud)
这是它正在运行(或保留)的查询:
select d.database_id , sd.sqlwatch_database_id, sd.sql_instance
into #d
from dbo.vw_sqlwatch_sys_databases d
inner join [dbo].[sqlwatch_meta_database] sd
on sd.[database_name] = d.[name] collate database_default
and sd.[database_create_date] = case when d.name = 'tempdb' …Run Code Online (Sandbox Code Playgroud) 使用 TSQL,如何确定 MS SQL 服务器(任何版本)是配置为使用静态端口还是使用动态端口?
我正在尝试使用的脚本:
DECLARE @TcpPort VARCHAR(5)
,@RegKey VARCHAR(100)
IF @@SERVICENAME !='MSSQLSERVER'
BEGIN
SET @RegKey = 'SOFTWARE\Microsoft\Microsoft SQL Server\' + @@SERVICENAME + '\MSSQLServer\SuperSocketNetLib\Tcp\IPAll'
END
ELSE
BEGIN
SET @RegKey = 'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER\SUPERSOCKETNETLIB\TCP\IPAll'
END
EXEC master..xp_regread
@rootkey = 'HKEY_LOCAL_MACHINE'
,@key = @RegKey
,@value_name = 'TcpPort'
,@value = @TcpPort OUTPUT
EXEC master..xp_regread
@rootkey = 'HKEY_LOCAL_MACHINE'
,@key = @RegKey
,@value_name = 'TcpDynamicPorts'
,@value = @TcpPort OUTPUT
SELECT @TcpPort AS PortNumber
,@@SERVERNAME AS ServerName
,@@SERVICENAME AS ServiceName
Run Code Online (Sandbox Code Playgroud) SSD = 固态硬盘
我们有一个关于服务器 CRM01(营销 CRM 服务器 - 运行大型查询)上的 tempDB 性能的具体问题:
在 CRM01 上,tempDB 数据和日志文件驻留在固态驱动器上。SSD 总大小为 400Gb。Tempdb 数据文件占用 300 Gb,日志占用约 100 Gb,可能需要增加但没有剩余空间。
这个问题是理论上的。我们确实理解: - 如果 tempdb 日志文件增长太多,我们应该拆分我们的进程,以便数据应该以更小的块处理,或者我们应该考虑使用可能的临时物理表而不是 tempdb。
但是,如果由于空间限制我们真的不得不决定将一些 tempdb 文件移出 SSD,您会选择将哪些文件移至标准的快速驱动器:数据文件还是日志文件?
什么不是 tempDB,它是一个普通的 DB。当然,我可以对表进行分区,并创建不同的文件组,但我仍然会将数据或日志保存在最快的磁盘中吗?
假设利用率为 50% 读取和 50% 更新和插入。
@Moderator,我同意问题的第二部分不客观,但它提供了见解和想法。
sql-server ×9
scripting ×3
index ×2
backup ×1
collation ×1
connectivity ×1
constraint ×1
dbcc ×1
delete ×1
encoding ×1
foreign-key ×1
kerberos ×1
kill ×1
logins ×1
monitoring ×1
performance ×1
permissions ×1
postgresql ×1
primary-key ×1
replication ×1
restore ×1
tempdb ×1
transaction ×1
xml ×1