Sql server 尝试基于SQL中的连接列进行查询时出现性能问题
我有两张桌子 表1:Sql server 尝试基于SQL中的连接列进行查询时出现性能问题,sql-server,performance,Sql Server,Performance,我有两张桌子 表1: ------------------------------- id | pid | name | place | num | ------------------------------- 表2: ------------------ pid | name | key | ------------------ 现在我正在编写一个查询,它是两列的串联,一列来自表1,另一列来自表2 select * from table1 join table2 on table1.
-------------------------------
id | pid | name | place | num |
-------------------------------
表2:
------------------
pid | name | key |
------------------
现在我正在编写一个查询,它是两列的串联,一列来自表1,另一列来自表2
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
选项对更新索引视图()引用的表的要求。如果未使用SQL Server Enterprise或Developer edition,则需要向查询添加NOEXPAND
提示,以便优化器考虑视图索引
另外,我强烈建议您避免使用保留关键字作为列名(key
和identity
)
如果一次只搜索一个值,则可以通过编程方式拆分这些值。这与其他答案类似,但会为您进行拆分
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\u Get\u Concat\u ID“ABC-123”。如果不需要所有列,请始终从select column1之类的表中选择特定列,tablename.column2在我看来类似于table2.key+'-'+table1.num='ABC-123'应该是where子句的一部分,而不是连接标准的一部分。我只想添加原始查询中的表达式由于连接而不可搜索。指定单个谓词可提供可搜索表达式,以便有效地使用这些列上的索引。无论是使用
内部联接
还是位置
。可能需要使用pid
、KEY
和num
列进行一些额外的索引调整,以获得最佳性能。通常只使用代码的答案。试着添加一个。谢谢
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