小编Maz*_*har的帖子

如何使用 TSQL 动态更改数据库

我在尝试将 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)

同样,它成功执行,但数据库没有改变。

sql-server dynamic-sql t-sql sql-server-2014

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

计算列无法持久化,因为该列是不确定的

我知道这不是第一次被问到这类问题。

但是为什么在以下场景中创建的持久计算列是“非确定性的”。答案应该总是一样的,对吧?

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',因为该列是不确定的。

我想我在这里遵循了确定性规则

是否可以在此处创建持久化计算列?

sql-server sql-server-2012 computed-column

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

在查询中的多列上调用相同表值函数的最有效方法

我正在尝试调整在 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

8
推荐指数
1
解决办法
6661
查看次数

提高参数化查询性能

我的任务是提高下面查询执行计划链接中显示的 SQL Server 2008 R2 查询(在存储过程中)的性能。

它目前在大约 7 秒内执行,如果可能,需要在 1-2 秒内完成。慢查询的每次执行总是在 7 秒左右。查询的结果涓涓细流。被查询的表很大,但不是数十亿行。

行数

行数

根据传递的参数,结果可以是几百行(执行亚秒)到 > 300K 行(这很慢)。

我已经包含了优化器正在使用的慢查询执行计划和索引。这是更快执行计划,并且STATISTICS IO, TIME

AsIs StatsIO_Time

有两个查询正在执行。第一个不是问题。这是我需要帮助的第二个。虽然需要,但删除非 SARGable 谓词 ( AND FT.TripDistance < ( CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33 )) 对速度略有不同

移除非 SARG

删除函数 [FN_GetLocalTime_FromUTC_BasedOnTZId] 对速度略有不同,这里是STATISTICS IO TIME删除非 SARG where 子句和函数:这是执行计划

删除非 SARG 和 Func

这是除了添加LOOP JOIN提示之外的未更改查询的输出。这个比较慢。

循环连接

我注意到,在慢速不变的查询计划中,FACT_trip_Statuses表上 Index Seek 的实际行数 (300330)接近最终输出 (299887)。然而,在索引行(4.87米)的实际数量寻求的xFactTrip_AnnexFACT_Trip以及FACT_Trip_Attributes是出路。我该如何解决?添加OPTION RECOMPILE几乎没有区别

我尝试添加跟踪标志 4199DBCC TRACEON (4199, …

performance sql-server sql-server-2008-r2 query-performance

7
推荐指数
1
解决办法
803
查看次数

T-SQL 夏令时查找表 - 表值函数性能不佳

我为 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

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

更新统计信息,现有的执行计划怎么样

如果更新了从未更新过的表的统计信息(不要问他们为什么从来没有更新过),SQL Server 是否会根据过时的统计信息自动刷新执行计划?如果没有,这样做的最佳方法是什么?

sql-server index-statistics

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

TSQL 重新启用约束需要很长时间

有什么办法可以加快重新启用约束的速度?

作为更新我们仓库中几个表的工作的一部分,这是在几个小时内完成的,重新启用对所述表的约束可能需要一个多小时。其余的工作,即更新,大约需要 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 constraint sql-server-2008-r2

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