Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server函数运行非常慢_Sql Server - Fatal编程技术网

Sql server SQL Server函数运行非常慢

Sql server SQL Server函数运行非常慢,sql-server,Sql Server,我有一个函数,它返回一个日期,运行10分钟以上。有什么线索吗?TMNC拥有超过300万条记录 SQL: 选择dbo.fn\u TMNCS\u BO\u MaxDate 这是我最近的一次重写 功能: 谢谢300万条记录并不是非常大,但它可能足够大,至少可以减慢试图找到最大值的函数的速度 我可以建议在DateOfData列中添加索引: CREATE INDEX idx ON dbo.TMNCS (DateOfData); 这应该可以让SQL Server非常快速地找到此列的最大值。假设索引是一个B

我有一个函数,它返回一个日期,运行10分钟以上。有什么线索吗?TMNC拥有超过300万条记录

SQL: 选择dbo.fn\u TMNCS\u BO\u MaxDate

这是我最近的一次重写 功能:


谢谢

300万条记录并不是非常大,但它可能足够大,至少可以减慢试图找到最大值的函数的速度

我可以建议在
DateOfData
列中添加索引:

CREATE INDEX idx ON dbo.TMNCS (DateOfData);
这应该可以让SQL Server非常快速地找到此列的最大值。假设索引是一个B树,SQL Server所要做的就是转到树的最左边/最右边,并在那里读取值


免责声明:如果在常规SQL查询的上下文中需要表中某列的最大值,请研究将
max
用作分析函数。

300万条记录不是非常大,但它可能足够大,至少会减慢试图查找最大值的函数的速度

我可以建议在
DateOfData
列中添加索引:

CREATE INDEX idx ON dbo.TMNCS (DateOfData);
这应该可以让SQL Server非常快速地找到此列的最大值。假设索引是一个B树,SQL Server所要做的就是转到树的最左边/最右边,并在那里读取值


免责声明:如果在常规SQL查询的上下文中需要表中某列的最大值,请研究将
max
用作分析函数。

我将使用窗口函数:

select t.*,
       max(DateOfData) over () as max_date
from dbo.TMNCS;

我将使用窗口函数:

select t.*,
       max(DateOfData) over () as max_date
from dbo.TMNCS;

如果您可以容忍假设表中最新的行具有最大日期,并且如果您有聚集索引(特别是标识) 然后你可以试试这个:

ALTER FUNCTION [dbo].[fn_TMNCS_MaxDate]
()
RETURNS date
AS
BEGIN
  DECLARE @ResultVar as date
  SELECT TOP (1) @ResultVar=  [DateOfData] FROM dbo.TMNCS ORDER BY TMNCS_ID DESC --Assuming this is the Clustered index/ identity col
  RETURN @ResultVar    
END
GO

如果您可以容忍假设表中最新的行具有最大日期,并且如果您有聚集索引(特别是标识) 然后你可以试试这个:

ALTER FUNCTION [dbo].[fn_TMNCS_MaxDate]
()
RETURNS date
AS
BEGIN
  DECLARE @ResultVar as date
  SELECT TOP (1) @ResultVar=  [DateOfData] FROM dbo.TMNCS ORDER BY TMNCS_ID DESC --Assuming this is the Clustered index/ identity col
  RETURN @ResultVar    
END
GO


您是否检查过其他列?首先,从性能角度来看,标量函数是出了名的差。内联表值函数几乎总是快几个数量级。但在这种情况下,我敢说你们并没有DateOfData的索引?您可以共享包含索引的表定义吗?也许您正在将其存储为varchar?这将是一个巨大的问题。一种解决方案是不使用标量函数。TMNCS是另一个具有7000万条记录的表的视图。DateOfData是主键的一部分,所以它是索引。你猜对了,我使用的是标量函数。没有猜测,你发布了标量函数。仅仅因为该列是主键的一部分,并不意味着索引覆盖了该查询。再说一遍,数据类型是什么?有很多原因可能会导致性能问题,但我们没有看到能够自信地回答的细节。您是否查阅了其他专栏?首先,从性能角度来看,标量函数是出了名的差。内联表值函数几乎总是快几个数量级。但在这种情况下,我敢说你们并没有DateOfData的索引?您可以共享包含索引的表定义吗?也许您正在将其存储为varchar?这将是一个巨大的问题。一种解决方案是不使用标量函数。TMNCS是另一个具有7000万条记录的表的视图。DateOfData是主键的一部分,所以它是索引。你猜对了,我使用的是标量函数。没有猜测,你发布了标量函数。仅仅因为该列是主键的一部分,并不意味着索引覆盖了该查询。再说一遍,数据类型是什么?有很多原因可能导致性能问题,但我们没有看到能够自信地回答的细节。是的,这肯定会有帮助,但OP使用标量函数会导致问题。然而,真正的解决办法是避免在这种情况下使用函数&而是使用类似于窗口函数的函数。@Yogeshharma如果OP只是在查询中使用这个标量函数,而实际上他应该直接调用
MAX
,那么我同意你的看法。但是,也许他在其他上下文中确实需要这个函数,或者更糟糕的是,他们可能把这个列作为varchar,它必须进行300万次隐式转换。如果是这样的话,那么任何索引都不会有帮助。是的,这肯定会有帮助,但OP使用标量函数会导致问题。然而,真正的解决办法是避免在这种情况下使用函数&而是使用类似于窗口函数的函数。@Yogeshharma如果OP只是在查询中使用这个标量函数,而实际上他应该直接调用
MAX
,那么我同意你的看法。但是,也许他在其他上下文中确实需要这个函数,或者更糟糕的是,他们可能把这个列作为varchar,它必须进行300万次隐式转换。如果是这种情况,那么索引就没有帮助。这假设OP是从普通查询调用标量函数,而不是在其他上下文中。这假设OP是从普通查询调用标量函数,而不是在其他上下文中。