【发布时间】:2018-04-09 02:13:34
【问题描述】:
我的数据库将 GUID 作为主键,这样做是为了在多个系统之间强制执行唯一性。 (是的,我知道每个表开销每行 16 个字节,除了公司选择之外还有其他选择)
为了让表格更友好一点,我添加了计算字段,所以如果你选择类似
SELECT * FROM Products
您不仅会获得具有外键的列,还会获得与其关联的友好字段。
例如 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
我应该指出,这些查找总是针对主键/聚集索引,所以我可以尽可能快地单独查找。
现在,虽然这在我们追溯问题时有很多优势,并且在我们查询大表时对主要使用效率没有任何影响(未查询计算字段,因此没有影响),但确实需要同时进行查找。我不想牺牲我正在查找的额外数据,也不想将其直接存储在表中(浪费数据并且需要维护)。我考虑过为每个表构建视图,但这似乎有点过头了,我宁愿不必加倍努力。
我确定我不是唯一这样工作的人,所以我想知道是否有人有更有效的方法来做到这一点?这些字段只供直接查看数据库的人使用,所有存储过程等都是用索引链接等完全编码的,所以主要运行效率很好,只是调试。问题不大,但如果有更好的解决方案,我很乐意听到。
提前致谢。
【问题讨论】:
-
所以您使用标量函数将计算列添加到表中以使开发人员更容易?他们不应该只学习如何编写连接吗?似乎输入该连接会比您尝试做的工作更少。
-
老实说,我在这里跟踪数据的次数和其他任何人一样多,越直观越好。所有花时间在数据上的人(和一个女孩)都非常有能力编写连接,只是每次看时都必须一遍又一遍地做。我宁愿做一次,不必再做一次。
-
或者编写一个视图来为它们进行连接。将其包装在标量 UDF 中将很快保证性能不佳。它将强制所有查找使用 RBAR 嵌套循环,并且存在与标量 UDF 相关的各种问题。
-
是的,我在以前的环境中使用了视图方法,但试图不在这里添加膨胀。我们之前使用它是因为我们允许客户访问我们为他们的 SSRS 报告预先优化的视图模式。我们最不想要的就是客户端尝试编写查询,无论我们的数据库多么紧凑。
标签: sql-server performance calculated-columns calculated-field