我的数据库将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
我应该指出,这些查找总是与主键/聚簇索引相对应,所以它们的速度与我可以的速度一样快。
现在虽然这对我们追踪问题时有很多好处,并且当我们查询大表时,对主要使用效率没有任何影响(计算字段未查询,因此没有影响),花点时间做一下查找。我不想牺牲我正在查找的额外数据,而且我不想将其直接存储在表格中(浪费数据并需要维护)。我已经考虑过为每张桌子建立视图,但这似乎有些过分,而且我不需要加倍努力。
我确定我不是唯一一个这样工作的人,所以我想知道是否有人有更有效的方法这样做?这些字段仅供直接查看数据库的人使用,所有存储过程等都使用索引链接等完全编码,因此主要运行效率很好,只需调试即可。这不是一个大问题,但如果有更好的解决方案,我很乐意听到它。
提前致谢。
答案 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)
我的建议:
companyGUID
列,您可以生成并使用NEWSEQUENTIALID
代替NEWID
,从而减少碎片。并提高指数表现。PERSISTED
选项来保持CompanyName列的持久性。