标签: t-sql

为什么计算列会突然降低性能?

用户可以在上午 10 点之前运行报告。在同样的报告变得非常缓慢之后,有时用户只是没有耐心等待。经过一些故障排除后,我找到了导致延迟的列。它是计算列,它使用函数来带来结果。

大约在同一时间,我收到了另一个关于运行缓慢报告的抱怨,那总是工作正常。经过一些故障排除后,我发现了导致延迟的列:

where (Amount - PTD) <> 0
Run Code Online (Sandbox Code Playgroud)

同样,该Amount列是计算列。

所以我的问题是:为什么总是作为报告一部分的所有突然计算列开始显着降低性能?大约在上午 10 点之后真正会发生什么?如果我制作这些列有persisted什么缺点?

谢谢

--FUNCTION 带列:

ALTER FUNCTION [dbo].[CalcInvoiceAmtPTD]
(@SInvNum INT, @entityGuid uniqueIdentifier) RETURNS MONEY
AS
BEGIN
    DECLARE @Amt MONEY

    declare @toplevel uniqueidentifier
    set @toplevel = (select dbo.gettoplevelentity(@entityguid))

    declare @t table 
    (
        Guid uniqueidentifier
    )

    insert into @t select * from dbo.getlinkedentities(@toplevel) where guid is not null
    declare @tbl table (amount money, glacctid int)

    select @amt = isNull(sum(amount), 0) from tblfin_journalpostings jp
        inner join tblfin_journal …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql

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

执行查询所花费的时间似乎比查询中测量的时间长......?

我正在尝试优化存储过程。我仅使用日期变量将一些手动分析插入到我的 SP 中,然后使用 datediff 显示经过的时间。

例如

DECLARE @MyDate datetime = GetDate()
PRINT '..profiling text...'
PRINT DateDiff(ms, @MyDate, GetDate())
SET @MyDate = GetDate()

<execute some actions here>

PRINT '..elapsed time...'
PRINT DateDiff(ms, @MyDate, GetDate())
SET @MyDate = GetDate()
Run Code Online (Sandbox Code Playgroud)

当我在 SQL Server Management Studio 的查询窗口中运行它时,我的配置文件的总耗用时间大约为 5 秒。但是,整个查询的持续时间更像是 14 秒,如右下角的查询属性所示(以及当我用手表手动计时时)。

有什么理由会发生这种情况吗?我放置或声明日期变量的位置没有任何问题。通过 datediff 和查询所用的时间输出的时间肯定不匹配。

还应该注意的是,在优化时,我没有返回任何大型数据表。我只是将它们插入到临时表中,以确保我没有返回结果的开销。

sql-server t-sql

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

即使表格存在,为什么 SSMS 显示红色波浪线(sp?)?

我正在创建一个新表并在此过程中创建两个外键。具有引用的主键的表存在,但 Intellisense 给出错误消息:“外键...引用无效表 'ROLES'。”

为什么 SQL Server Management Studio 无法识别这些表?

ssms intellisense t-sql sql-server-2012

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

从 Alter Table 语句添加的更新字段

我正在尝试更新刚刚从ALter语句中添加的字段。我收到以下错误:

消息 207,级别 16,状态 1,过程 TestProc,第 436 行
无效的列名称“discountamount”。

这是我尝试使用的语法 - 更新刚刚添加到存储过程中的字段的正确方法是什么?

ALTER TABLE [dbo].msnbc
ADD saleamount float,
discountamount float;

UPDATE ftri
SET ftri.discountamount = fji.Totaldiscountamount
FROM [dbo].msnbc ftri
INNER JOIN [dbo].halfbaked fji
ON ftri.saleid = fji.saleid
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

两个表的区别

我试图找出两个表之间的差异,每个表都在不同的数据库中。我以为我可以做一个完整的外连接,但我得到的结果太多了。

下面的 T-SQL 返回 167 个结果

SELECT N'{'+ADobjectGUID+N'}' [GUID], first_name [First], last_name [Last], description [Full] FROM [db1].[dbo].[tb1] where delete_date is null
except
SELECT ObjectGUID [GUID], GivenName [First], sn [Last], displayName [Full] FROM [db2].[dbo].[tb1]
Run Code Online (Sandbox Code Playgroud)

当我将其反转为以下时,它返回 214 个结果

SELECT ObjectGUID [GUID], GivenName [First], sn [Last], displayName [Full] FROM [db2].[dbo].[tb1]
except
SELECT N'{'+ADobjectGUID+N'}' [GUID], first_name [First], last_name [Last], description [Full] FROM [db1].[dbo].[tb1] where delete_date is null
Run Code Online (Sandbox Code Playgroud)

但是,我需要的不仅仅是数据库中的那些列,因此我无法使用该except语句。

select N'{'+ADobjectGUID+N'}' [GUID], first_name [First], last_name [Last], db1.dbo.tb1.description [Full], domain_user_id, sAMAccountName, employeeID 
from db1.dbo.tb1 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql except

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

如何使用 securityadmin 服务器角色模拟登录名

在 MSSQL 2008R2 上,我在不同的服务器上有两个实例,我需要同步所有登录的密码更改。我认为我可以创建一个存储过程,其中具有 securityadmin 服务器角色的用户(模拟)更改密码。

Obs:CHANGE_PASSWORD 是具有 securityadmin 服务器角色的用户。

ALTER PROCEDURE SPU_CAMBIO_PASSWORD
(
    @USER VARCHAR(50),
    @PASSWORD VARCHAR(100)
)
WITH EXECUTE AS 'CHANGE_PASSWORD'
AS
    DECLARE @STATEMENT VARCHAR(200)
    SET @STATEMENT= 'ALTER LOGIN '+ @USER+ ' WITH PASSWORD = '''+@PASSWORD+''', CHECK_POLICY =OFF'
    EXEC(@STATEMENT)
GO
Run Code Online (Sandbox Code Playgroud)

错误:无法作为服务器主体执行,因为主体“CAMBIO_PASSWORD”不存在,无法模拟此类主体,或者您没有权限。

sql-server permissions t-sql sql-server-2008-r2 impersonation

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

更新 SQL Server 中的前 1 行

我知道通常你会有一个自动编号字段 - 但在这种情况下没有,老实说,更新哪一行并不重要,只要它只有 1。

我有一个 DDL 示例,例如一张包含请求数量的表和一张包含可用数量的表。我想@Test1.amtonhand使用 from 的值进行更新@Test2.amtonhand并加入,@Test1.nrs=@Test2.nrs但只更新 1 条记录@Test1

这是如何在 SQL Server 2008 中实现的

    Declare @Test1 Table
(
    nrs varchar(100)
    ,amtrqst varchar(100)
    ,amtonhand varchar(100)
)

Declare @Test2 Table
(
    nrs varchar(100)
    ,amtonhand varchar(100)
)


Insert Into @Test1 (nrs, amtrqst) Values
('abc', '10'), ('abc', '12'), ('abc', '13'), ('def', '5'), ('def', '12')

Insert Into @Test2 (nrs, amtonhand) Values
('abc', '10'), ('def', '5')
Run Code Online (Sandbox Code Playgroud)

编辑
我想要的更新结果是

@Test1 --
abc, 10, 10
abc, 12
abc, 13 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 t-sql sql-server-2008-r2

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

如何提高同一表上查询匹配的性能

我需要在同一个表中查找可能匹配的客户记录。逻辑如下。然而,这似乎在 O(N²) 下执行。有没有办法提高这里的性能?我试过设置索引、散列列并进行比较等,但在大型数据集上的性能仍然很糟糕。我还在下面添加了查询计划。

SELECT
    C1.CustomerId AS Customer1, 
    C2.CustomerId AS Customer2
FROM Customer C1
INNER JOIN Customer C2
    ON 
    C1.CustomerId != C2.CustomerId
    AND
    (C1.FirstName = C2.FirstName OR C1.BirthDate = C2.BirthDate)
    AND
    (
        C1.EmailAddress = C2.EmailAddress
        OR
        C1.MobilePhoneNumber = C2.MobilePhoneNumber
        OR
        (
            C1.HomeAddressLine1 = C2.HomeAddressLine1
            AND
            (
                C1.HomePostCode = C2.HomePostCode
                OR
                C1.HomeSuburb = C2.HomeSuburb
            )
        )
    )
Run Code Online (Sandbox Code Playgroud)

查询计划

performance sql-server t-sql query-performance

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

避免在 SQL Server 的联接中使用复杂的字符串?

我将在 SQL Server 中为客户端创建几个表。对这个问题特别感兴趣的是FactStoreSale要创建表,并DimProduct在其中的第一个表将包括所有门店的销售情况,并包括例如StoreKeyDateKeyTimeKeyProductKey和销售数据。

DimProduct表将在关于产品,使用补充数据,即ProductNameProductGroupProductCategory等这个表将在价格等每个商店而言缓慢改变的尺寸和存储产品的历史。该表将包括列FromDateToDate,它们分别描述了输入数据的时间和替换数据的时间(默认值为 2999 年,ToDate直到插入产品的新更新)。

我相信这是很常见的。但是,ProductKeys来自底层数据库的非常复杂的字符串,例如140-xx4449CH-4.44,9.

在我看来,我的替代方案是Checksum在 SQL Server 中使用将复杂字符串转换为整数,并将它们存储在单独的列中,ProductKeyInt 并在执行 JOINS 时使用这些列。但是校验和不保证唯一的整数值,这可能会导致问题。当我在 Virtual PC 和我自己的 PC 上尝试 Checksum 时,对相同值执行 Checksum 会返回不同的结果,这也是一个问题。我相信这两者一起排除了校验和,除非可以以某种方式操纵它以使其更独特?

另一种选择是使用更复杂的函数来确保将字符串值转换为整数,例如在我的问题中提供的此处。诸如这样的解决方案但也有问题,该值100-xx31003将例如得到同样的结果。从某种意义上说,如果对 SQL 不那么精通的人需要尝试查找使用该函数的 Query 的任何问题,则可能很难理解正在发生的事情,这也很复杂。

我的第三个选择似乎是使用该DimProduct表并首先从 SQL 代理更新该表,然后在该表上使用索引键并将该索引用作FactStoreSale表中的 ProductKeyInt(例如 ProductKeyInt 将是某种子查询FactStoreSale获取与 …

join data-warehouse database-design sql-server t-sql

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

T-SQL 和 MDX 之间最相关的相似之处是什么?

我使用过 T-SQL(CTE、窗口函数、递归 CTE、大数据、表值函数、APPLY、PIVOT、存储过程等),但从未查询过 Microsoft SSAS 多维数据集。

对于以下 T-SQL 概念,MDX 中是否有类似的概念?

  • 转轴
  • 窗口函数
  • 递归公用表表达式

使用 MDX 的 T-SQL 用户是否有任何陷阱?

我希望 T-SQL 和 MDX 之间有一些共同的类比,这将有助于擅长 T-SQL 的人过渡到 MDX。

如果有一个关于从 T-SQL 进入 MDX 时所犯的常见错误的指南,那就太好了。

sql-server learning ssas t-sql mdx

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