SQL计算的字段效率

时间:2017-10-27 12:56:37

标签: sql-server performance calculated-columns calculated-field

我的数据库将GUID作为主键,这样做是为了在多个系统中强制实现唯一性。 (是的,我知道每个表开销每行16个字节,还有其他选项,但公司选择)

为了使表格更友好,我添加了计算字段,因此如果你选择了

SELECT * FROM Products

您不仅会获得包含外键的列,而且还会获得与之关联的友好字段。

e.g。 CompanyGUID(存储字段),CompanyName(计算字段)

计算字段通过标量函数运行,例如:

CREATE FUNCTION [mySchema].[udf_CompanyNameFromGUID] (@GUID UNIQUEIDENTIFIER)
RETURNS NVARCHAR(MAX)
AS
    BEGIN
        DECLARE @Return NVARCHAR(MAX)
        SELECT  @Return = CompanyName
        FROM    mySchema.Companies
        WHERE   CompanyGUID = @GUID
        RETURN @Return
    END

我应该指出,这些查找总是与主键/聚簇索引相对应,所以它们的速度与我可以的速度一样快。

现在虽然这对我们追踪问题时有很多好处,并且当我们查询大表时,对主要使用效率没有任何影响(计算字段未查询,因此没有影响),花点时间做一下查找。我不想牺牲我正在查找的额外数据,而且我不想将其直接存储在表格中(浪费数据并需要维护)。我已经考虑过为每张桌子建立视图,但这似乎有些过分,而且我不需要加倍努力。

我确定我不是唯一一个这样工作的人,所以我想知道是否有人有更有效的方法这样做?这些字段仅供直接查看数据库的人使用,所有存储过程等都使用索引链接等完全编码,因此主要运行效率很好,只需调试即可。这不是一个大问题,但如果有更好的解决方案,我很乐意听到它。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您的主要性能问题不是由于SCALAR FUNCTION使用而导致的查找造成的。

为每一行调用标量函数,并且它本身不是免费的,但是对于您会对性能产生很大影响的行数进行乘法运算。

可能view是您的解决方案:它不需要任何额外的空间,因为它只是在您使用视图时会展开的代码,而在视图中只是加入您的表格mySchema.Companies

create view dbo.MyView as
select * -- put here your columns of interest including CompanyName
from dbo.YourTable
     join  mySchema.Companies
         on CompanyGUID = @GUID;

答案 1 :(得分:0)

我的建议:

  1. 对于companyGUID列,您可以生成并使用NEWSEQUENTIALID代替NEWID,从而减​​少碎片。并提高指数表现。
  2. 您可以通过添加PERSISTED选项来保持CompanyName列的持久性。