标签: sql-server

SQL 代理如何以及何时更新 next_run_date/next_run_time 值?

我一直在研究 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 分钟后再回来时,它现在可以正确显示与下一次计划运行相对应的日期和时间值。

所以我的问题是:

  • 这些值多久更新一次?
  • 更新这些值的过程是什么?
  • 如果我要添加一个计划,比如说,未来 1 分钟,这是否意味着该作业将不会运行,因为 next_run_date/time 尚未更新?

我用来添加新计划的代码示例:

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)

sql-server-2008 sql-server sql-server-agent

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

为什么 CTE 应该以分号开头?

我只是在看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 之前使用分号的内容。

sql-server syntax cte t-sql

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

是否可以提高具有数百万行的窄表的查询性能?

我有一个查询目前平均需要 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)

performance sql-server optimization query-performance

16
推荐指数
2
解决办法
7807
查看次数

在 SAN 环境中对 SQL 索引进行碎片整理有什么好处吗?

我们的 SQL 服务器位于 SAN 上。它包含数十个 OLTP 数据库,其中一些数据库包含多个包含超过 100 万条记录的表。

我们每周都在运行Ola Hallengren 的索引维护脚本,每次运行几个小时。根据碎片阈值,脚本将重新组织或重新索引索引。我们观察到在重新索引期间,日志文件变得很大,这导致日志传送期间带宽消耗过多。

然后是Brent Ozar 的一篇文章,他说不要担心 SQL 索引:

您的硬盘驱动器与同时发出驱动器请求的其他服务器共享,因此驱动器总是会到处跳跃以获取数据。对索引进行碎片整理只是毫无意义的繁忙工作。

谷歌搜索这个问题会导致不同的意见,大多数支持似乎太简短或太弱的论点。我们的暂定计划是在我们的维护脚本中调整碎片阈值,以便它比重新索引更频繁地重新组织。

最终判决是什么?考虑到与运行每周维护作业相关的负担,是否值得对 SAN 上的 SQL 索引进行碎片整理?

index sql-server database-recommendation sql-server-2008-r2 san

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

SQL Server NTFS 分配单元大小

在运行 SQL Server 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能有多重要。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)默认为 4 KB 而不是 64 KB。SQL 服务器已安装。

是否值得一试——卸载 SQL——将驱动器格式化为 64 KB 集群大小并重新安装 SQL 服务器?

sql-server-2008 sql-server

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

varchar 大小在临时表中是否重要?

在我妻子的工作中,关于仅使用存储过程中临时表中的varchar(255)所有varchar字段存在争议。基本上,一个阵营希望使用 255,因为即使定义发生变化它也始终有效,而另一个阵营则希望坚持使用源表中的大小以提高潜在的性能。

表演营对吗?是否有其他影响?他们正在使用 SQL Server。

performance sql-server datatypes temporary-tables

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

将主键移动到文件组 (SQL Server 2012)

如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:

  1. 删除非聚集索引(需要重新使用和重建它们)
  2. 删除聚集索引(需要对整个表进行重新排序)
  3. 创建新的主键约束(巨大的排序操作)
  4. 创建所有非聚集索引(需要排序和写入)

有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。

有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。

index sql-server filegroups sql-server-2012

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

授予从系统表中选择的权限

我有一个数据库 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)

我究竟做错了什么?

sql-server

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

SQL Server 2012 比 2008 慢

我将大型网站和数据库从旧服务器(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)

performance sql-server sql-server-2012

16
推荐指数
2
解决办法
4万
查看次数

在 SQL Server 中安全地生成 UNIQUEIDENTIFIER

我打算使用 aUNIQUEIDENTIFIER作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。

我需要生成多个这样的标识符作为INSERT...SELECT语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。

如何生成安全的随机数UNIQUEIDENTIFIER?请注意,这NEWID不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM, RANDor 的东西GETUTCDATE也不符合条件。

security sql-server uniqueidentifier sql-server-2012 cryptography

16
推荐指数
2
解决办法
7213
查看次数