繁体   English   中英

尝试基于SQL中的串联列进行查询时的性能问题

[英]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提示,以使优化器考虑视图索引。

另外,我强烈建议您避免使用保留的关键字作为列名( keyidentity )。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM