gpt4 book ai didi

sql-server - 连接多个 nvarchar 列

转载 作者:行者123 更新时间:2023-12-01 06:17:42 25 4
gpt4 key购买 nike

我有一个这样的表:

CREATE TABLE [dbo].[Table](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[A] [NVARCHAR](150) NULL,
[B] [NVARCHAR](150) NULL,
[C] [NVARCHAR](150) NULL,
[D] [NVARCHAR](150) NULL,
[E] [NVARCHAR](150) NULL,
CONSTRAINT [con] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

并寻找性能改进以加入此表。

选项 1 - 将所有字符串组合成 nvarchar 主键,然后执行:

Source.[A] + Source.[B] + Source.[C] + Source.[D] + Source.[E] = Table.PKString

据我所知,这是不好的做法。

选项 2 - 使用:

Source.[A] + Source.[B] + Source.[C] + Source.[D] + Source.[E] = Target.[A] + Target.[B] + Target.[C] + Target.[D] + Target.[E]

选项 3 - 使用:

Source.[A] = Target.[A] And
...
Source.[E] = Target.[E]

最佳答案

您的选项 1 将无法正常工作,因为它将 ('ab','c') 视为等于 ('a','bc') .

此外,您的列可以为 null,并且连接 null 会产生 null。

由于可空性,您不能将所有列组合成一个 nvarchar 主键,即使没有它,您仍然有失败的风险,因为最大长度为 1,500 字节,远远超过了最大索引键列大小。

出于类似的长度原因,使用所有列的复合索引也行不通。

您可以创建一个计算列,该列使用所有这 5 个列值作为输入来计算校验和或哈希值并对其进行索引。

ALTER TABLE [dbo].[Table]
ADD HashValue AS CAST(hashbytes('SHA1', ISNULL([A], '') + ISNULL([B], '')+ ISNULL([C], '')+ ISNULL([D], '')+ ISNULL([E], '')) AS VARBINARY(20));


CREATE INDEX ix
ON [dbo].[Table](HashValue)
INCLUDE ([A], [B], [C], [D], [E])

然后在与其他 5 列的剩余谓词的连接中使用它以防散列冲突。

如果你想让NULL比较相等你可以使用

SELECT *
FROM [dbo].[Table1] source
JOIN [dbo].[Table2] target
ON source.HashValue = target.HashValue
AND EXISTS(SELECT source.A,
source.B,
source.C,
source.D,
source.E
INTERSECT
SELECT target.A,
target.B,
target.C,
target.D,
target.E)

请注意,上面创建的索引基本上复制了整个表,因此如果您的查询需要覆盖它,您可能需要考虑创建集群索引。

关于sql-server - 连接多个 nvarchar 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com