我在尝试将 SSMS 的上下文动态更改为动态 SQL 中指定的数据库时遇到问题:
EXEC sys.sp_executesql N'USE db1 ' ;
Run Code Online (Sandbox Code Playgroud)
它成功执行,但 SSMS 的数据库上下文不会改变。
我试过对上面的稍作修改
DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)
同样,它成功执行,但数据库没有改变。
我知道这不是第一次被问到这类问题。
但是为什么在以下场景中创建的持久计算列是“非确定性的”。答案应该总是一样的,对吧?
CREATE TABLE dbo.test (Id INT, EventTime DATETIME NULL, PosixTime INT NOT NULL)
GO
DECLARE @EventTime DATETIME = '20181001 12:00:00'
DECLARE @GPSTime INT = DATEDIFF(SECOND, '19700101', @EventTime)
INSERT INTO dbo.Test(Id, EventTime, PosixTime)
VALUES (1, @EventTime, @GPSTime)
, (2, NULL, @GPSTime)
GO
SELECT * FROM dbo.test
GO
ALTER TABLE dbo.test ADD UTCTime AS CONVERT(DATETIME2,ISNULL(EventTime, DATEADD(SECOND, PosixTime, CONVERT(DATE,'19700101'))),112) PERSISTED
GO
Run Code Online (Sandbox Code Playgroud)
消息 4936,级别 16,状态 1,第 42 行无法保留表 'test' 中的计算列 'UTCTime',因为该列是不确定的。
是否可以在此处创建持久化计算列?
我正在尝试调整在 20 列上调用相同表值函数 (TVF) 的查询。
我做的第一件事是将标量函数转换为内联表值函数。
是否使用性能CROSS APPLY
最佳的方式在查询中的多个列上执行相同的函数?
一个简单的例子:
SELECT Col1 = A.val
,Col2 = B.val
,Col3 = C.val
--do the same for other 17 columns
,Col21
,Col22
,Col23
FROM t
CROSS APPLY
dbo.function1(Col1) A
CROSS APPLY
dbo.function1(Col2) B
CROSS APPLY
dbo.function1(Col3) C
--do the same for other 17 columns
Run Code Online (Sandbox Code Playgroud)
有更好的选择吗?
可以在针对 X 个列的多个查询中调用相同的函数。
这是函数:
CREATE FUNCTION dbo.ConvertAmountVerified_TVF
(
@amt VARCHAR(60)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH cteLastChar
AS(
SELECT LastChar = RIGHT(RTRIM(@amt), 1)
) …
Run Code Online (Sandbox Code Playgroud) performance sql-server optimization functions sql-server-2016 query-performance
我的任务是提高下面查询执行计划链接中显示的 SQL Server 2008 R2 查询(在存储过程中)的性能。
它目前在大约 7 秒内执行,如果可能,需要在 1-2 秒内完成。慢查询的每次执行总是在 7 秒左右。查询的结果涓涓细流。被查询的表很大,但不是数十亿行。
根据传递的参数,结果可以是几百行(执行亚秒)到 > 300K 行(这很慢)。
我已经包含了优化器正在使用的慢查询执行计划和索引。这是更快执行的计划,并且STATISTICS IO, TIME
:
有两个查询正在执行。第一个不是问题。这是我需要帮助的第二个。虽然需要,但删除非 SARGable 谓词 ( AND FT.TripDistance < ( CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33 )
) 对速度略有不同
删除函数 [FN_GetLocalTime_FromUTC_BasedOnTZId] 对速度略有不同,这里是STATISTICS IO TIME
删除非 SARG where 子句和函数:这是执行计划
这是除了添加LOOP JOIN
提示之外的未更改查询的输出。这个比较慢。
我注意到,在慢速不变的查询计划中,FACT_trip_Statuses
表上 Index Seek 的实际行数 (300330)接近最终输出 (299887)。然而,在索引行(4.87米)的实际数量寻求的xFactTrip_Annex
,FACT_Trip
以及FACT_Trip_Attributes
是出路。我该如何解决?添加OPTION RECOMPILE
几乎没有区别
我尝试添加跟踪标志 4199DBCC TRACEON (4199, …
我为 GMT 地区创建了一个“夏令时”查找日历表。我用来查询表以从 UTC 日期时间返回本地日期时间的函数性能不佳。
任何有助于改善这一点的帮助,包括改变 TVF 的编码方式,将不胜感激。
该函数将用于可以频繁返回 1m+ 行的查询。该函数用于查询包含行程数据的仓库表。
行程的开始和结束日期时间以 UTC 格式存储,上面的函数用于将它们转换为本地时间。一位早已离开公司的开发人员编写了一个将 UTC 时间转换为本地时间的标量函数。我的任务是使用日历表和 TVF 重写该函数,因为 TVF 的性能应该比标量函数更好
没有功能:
SQL Server Execution Times: CPU time = 4633 ms, elapsed time = 4909 ms.
Run Code Online (Sandbox Code Playgroud)
具有以下功能:
SQL Server Execution Times: CPU time = 20795 ms, elapsed time = 21176 ms.
Run Code Online (Sandbox Code Playgroud)
这是表中的示例输出
CREATE TABLE dbo.DSTLookup
(
[Id] int,
[Tzid] int,
[DT_WhenSwitch] datetime,
[DSTOffSetSeconds] int,
[GMTOffSetSeconds] int
)
INSERT INTO dbo.DSTLookup
VALUES (29, 2, N'2014-03-30T01:00:00', 3600, 0),
(30, 2, N'2014-10-26T02:00:00', …
Run Code Online (Sandbox Code Playgroud) performance sql-server sql-server-2008-r2 set-returning-functions query-performance
如果更新了从未更新过的表的统计信息(不要问他们为什么从来没有更新过),SQL Server 是否会根据过时的统计信息自动刷新执行计划?如果没有,这样做的最佳方法是什么?
有什么办法可以加快重新启用约束的速度?
作为更新我们仓库中几个表的工作的一部分,这是在几个小时内完成的,重新启用对所述表的约束可能需要一个多小时。其余的工作,即更新,大约需要 5 分钟。在更新开始之前禁用相同的约束是亚秒。
编辑
有问题的工作是在给定日期之前更新数据行上的 PK 和 FK,以防止这些记录出现在报告中。soft delete
如果你愿意,一种记录方式。
大多数表格行大小均大于 130m 行,但超过 370m 行的除外。其他两个较小。
TableName rows
Table_1 371255778
Table_2 131703902
Table_3 131665535
Table_4 131665535
Table_5 131665535
Table_6 131665535
Table_7 19364988
Table_8 1458800
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令禁用每个表上的约束
ALTER TABLE database.dbo.table_name NOCHECK CONSTRAINT ALL;
以及以下再次重新启用它们
ALTER TABLE database.dbo.table_name WITH CHECK CHECK CONSTRAINT ALL;
没有同时运行的报告或其他作业。
是否需要很长时间才能重新启用约束预期行为,或者是否可以采取一些措施来加快速度?
提前致谢
sql-server ×7
performance ×3
constraint ×1
dynamic-sql ×1
functions ×1
optimization ×1
t-sql ×1