我一直在研究 T-SQL 中的代码,以使用 msdb 数据库中的 sp_add_jobschedule proc 向 SQL 代理作业添加新计划。当我添加新计划(通常在特定日期/时间运行一次)并立即查看 sysjobschedules 和 sysschedules 中的值时,我可以看到新计划已添加并与我的 SQL 代理的 job_id 相关联工作。但是,next_run_date 和 next_run_time 的值在其中为 0。当我在 2 或 3 分钟后再次查看它们时,它们仍然显示为 0。但是,当我再过 5 或 10 分钟后再回来时,它现在可以正确显示与下一次计划运行相对应的日期和时间值。
所以我的问题是:
我用来添加新计划的代码示例:
exec msdb.dbo.sp_add_jobschedule @job_id = @jobID
, @name = @JobName
, @enabled = 1
, @freq_type = 1
, @freq_interval = 0
, @freq_subday_type = 0
, @freq_subday_interval = 0
, @freq_relative_interval = 0
, @freq_recurrence_factor = 0
, @active_start_date = …Run Code Online (Sandbox Code Playgroud) 我只是在看StackOverflow上的一篇文章,其中 Aaron Bertrand 建议使用 CTE 而不是数字表,这是执行手头任务的一种优雅方式。我的问题是,为什么 CTE 的第一行以分号开头?
;WITH n AS (SELECT TOP (10000) n FROM
(SELECT n = ROW_NUMBER() OVER
(ORDER BY s1.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!
Run Code Online (Sandbox Code Playgroud)
这是为了确保 WITH 语句不会被解析为以前的内容SELECT或其他内容吗?我在 SQL Server 2005 BOL 中没有看到关于在 WITH 之前使用分号的内容。
我有一个查询目前平均需要 2500 毫秒才能完成。我的表很窄,但有 4400 万行。我有什么选择可以提高性能,或者这是否已经达到了最好的效果?
查询
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Run Code Online (Sandbox Code Playgroud)
桌子
CREATE TABLE [dbo].[Heartbeats](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DeviceID] [int] NOT NULL,
[IsPUp] [bit] NOT NULL,
[IsWebUp] [bit] NOT NULL,
[IsPingUp] [bit] NOT NULL,
[DateEntered] [datetime] NOT NULL,
CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
指数
CREATE NONCLUSTERED INDEX …Run Code Online (Sandbox Code Playgroud) 我们的 SQL 服务器位于 SAN 上。它包含数十个 OLTP 数据库,其中一些数据库包含多个包含超过 100 万条记录的表。
我们每周都在运行Ola Hallengren 的索引维护脚本,每次运行几个小时。根据碎片阈值,脚本将重新组织或重新索引索引。我们观察到在重新索引期间,日志文件变得很大,这导致日志传送期间带宽消耗过多。
然后是Brent Ozar 的一篇文章,他说不要担心 SQL 索引:
您的硬盘驱动器与同时发出驱动器请求的其他服务器共享,因此驱动器总是会到处跳跃以获取数据。对索引进行碎片整理只是毫无意义的繁忙工作。
谷歌搜索这个问题会导致不同的意见,大多数支持似乎太简短或太弱的论点。我们的暂定计划是在我们的维护脚本中调整碎片阈值,以便它比重新索引更频繁地重新组织。
最终判决是什么?考虑到与运行每周维护作业相关的负担,是否值得对 SAN 上的 SQL 索引进行碎片整理?
index sql-server database-recommendation sql-server-2008-r2 san
在运行 SQL Server 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能有多重要。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)默认为 4 KB 而不是 64 KB。SQL 服务器已安装。
是否值得一试——卸载 SQL——将驱动器格式化为 64 KB 集群大小并重新安装 SQL 服务器?
在我妻子的工作中,关于仅使用存储过程中临时表中的varchar(255)所有varchar字段存在争议。基本上,一个阵营希望使用 255,因为即使定义发生变化它也始终有效,而另一个阵营则希望坚持使用源表中的大小以提高潜在的性能。
表演营对吗?是否有其他影响?他们正在使用 SQL Server。
如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:
有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。
有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。
我有一个数据库 Microsoft SQL Server 2008 r2。定义了一个名为 marie 的用户,该用户可以访问主数据库上的表;这很好用。现在,我希望 marie 能够执行此查询:
SELECT resource_type,spid,login_time,status,hostname,program_name,nt_domain,nt_username,loginame
FROM sys.dm_tran_locks dl
JOIN sys.sysprocesses sp on dl.request_session_id = sp.spid
Run Code Online (Sandbox Code Playgroud)
涉及的表是主表;我如何允许玛丽阅读它们?我已经尝试以 dbo 身份执行以下操作:
GRANT ALL on sys.dm_tran_locks TO marie
GRANT ALL on sys.sysprocesses TO marie
Run Code Online (Sandbox Code Playgroud)
尽管如此,当 marie 尝试执行上面的查询时,错误是:
Msg 297, Level 16, State 1, Line 1
The user does not have permission to perform this action.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我将大型网站和数据库从旧服务器(Windows 2008 / SQL Server 2008 / 16 GB RAM / 2 x 2.5 GHz 四核 / SAS 磁盘)迁移到更新、更好的服务器(Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16 核处理器 / SSD 磁盘)。
我分离了旧服务器上的数据库文件,将它们复制并附加到新服务器上。一切都很顺利。
之后,我将兼容级别更改为 110,更新统计信息,重建索引。
令我非常失望的是,我注意到大多数 sql 查询在新的 SQL 2012 服务器上比在旧的 SQL 2008 服务器上慢得多(慢 2-3-4 倍)。
例如,在一个包含大约 70 万条记录的表上,在旧服务器上查询索引需要大约 100 毫秒。在新服务器上,相同的查询大约需要 350 毫秒。
所有查询都会发生同样的情况。
我会很感激这里的一些帮助。让我知道要检查/验证的内容。因为我发现很难相信在具有更新 SQL Server 的更好服务器上,性能会更差。
更多细节:
内存设置为最大。
我有这个表和索引:
CREATE TABLE [dbo].[Answer_Details_23](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT …Run Code Online (Sandbox Code Playgroud) 我打算使用 aUNIQUEIDENTIFIER作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。
我需要生成多个这样的标识符作为INSERT...SELECT语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。
如何生成安全的随机数UNIQUEIDENTIFIER?请注意,这NEWID不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM, RANDor 的东西GETUTCDATE也不符合条件。
security sql-server uniqueidentifier sql-server-2012 cryptography
sql-server ×10
performance ×3
index ×2
cryptography ×1
cte ×1
datatypes ×1
filegroups ×1
optimization ×1
san ×1
security ×1
syntax ×1
t-sql ×1