Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 尝试基于SQL中的连接列进行查询时出现性能问题_Sql Server_Performance - Fatal编程技术网

Sql server 尝试基于SQL中的连接列进行查询时出现性能问题

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.

我有两张桌子

表1:

-------------------------------
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