[英]Performance issue when trying to query based on concatenated columns in SQL
我有两张桌子
表格1:
-------------------------------
id | pid | name | place | num |
-------------------------------
表2:
------------------
pid | name | key |
------------------
现在,我正在编写一个查询,该查询由两列组成,一列来自table1,另一列来自table2。
select *
from table1 join table2
on table1.pid = table2.pid
and table2.key + '-' + table1.num = 'ABC-123'
由于此连接是在两个表上完成的,因此必须再次扫描大多数行以获取结果,因此结果获取非常缓慢,并且不是瞬时的,这是可以预期的。
在这种情况下,建议使用。 谁能帮我这个。
最初,人们认为创建一个基于函数的索引可以使性能有所提高,但是我不确定这是否会有所帮助。 而且,我无法在不同表的两列上创建基于函数的索引。
新增加的内容:
给出的答案是合法的,但我认为这超出了我的实际要求。 如果我有这样的要求
select table2.key + '-' + table1.num identity
from table1 join table2
on table1.pid = table2.pid
实际要求是我必须将两个表中的值连接起来并在视图中公开它。 然后,任何人都可以从视图中查询该列的标识。 因此,基本上必须进行串联。
这样尝试
SELECT *
FROM table1
JOIN table2
ON table1.pid = table2.pid
AND table2.KEY = 'ABC'
AND table1.num = '123'
而不是使用一个字符串“ ABC-123”,请尝试将其拆分为“ ABC”和“ 123”-
SELECT *
FROM table1
JOIN table2
ON table1.pid = table2.pid
AND
table2.key IN ('ABC')
AND
table1.num IN ('123')
如果希望用户能够有效地查询级联值,则可以创建索引视图。 可以根据需要添加其他视图列。 请注意用于更新索引视图引用的表的SET
选项要求( https://msdn.microsoft.com/zh-cn/library/ms191432.aspx )。 如果您使用的不是SQL Server Enterprise或Developer版本,则需要在查询中添加NOEXPAND
提示,以使优化器考虑视图索引。
另外,我强烈建议您避免使用保留的关键字作为列名( key
和identity
)。
CREATE VIEW dbo.IndexedView
WITH SCHEMABINDING
AS
SELECT table2.[key] + '-' + table1.num [identity]
FROM dbo.table1
JOIN dbo.table2
ON table1.pid = table2.pid;
GO
CREATE UNIQUE CLUSTERED INDEX cdx_IndexedView ON IndexedView([identity]);
GO
如果一次只搜索一个值,则可以通过编程将这些值拆分。 这与其他答案类似,但会为您进行拆分。
CREATE PROCEDURE usp_Get_Concat_ID
@ConcatID AS varchar(20)
AS
BEGIN
declare @Table1Num as varchar(20) = SUBSTRING(@ConcatID, 0, CHARINDEX('-', @ConcatID))
declare @Table2Key as varchar(20) = SUBSTRING(@ConcatID, CHARINDEX('-', @ConcatID)+1, LEN(@ConcatID))
select *
from table1 join table2
on table1.pid = table2.pid
and table1.num = @Table1Num
and table2.key = @Table2Key
END
GO
然后,您只需将usp_Get_Concat_ID称为“ ABC-123”即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.