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

时间:2015-03-31 11:47:40

标签: sql-server performance

我有两张桌子

表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

实际要求是我必须连接两个表中的值并在视图中公开它。然后任何人都可以从视图中查询该列标识。所以基本上连接是必须的。

4 个答案:

答案 0 :(得分:2)

试试这个,

SELECT *
FROM   table1
       JOIN table2
         ON table1.pid = table2.pid
            AND table2.KEY = 'ABC'
            AND table1.num = '123' 

答案 1 :(得分:0)

而不是使用一个字符串'ABC-123'尝试将其拆分为'ABC'& '123'-

    SELECT * 
    FROM table1 
    JOIN table2 
    ON table1.pid = table2.pid 
    AND 
    table2.key IN ('ABC')  
    AND 
    table1.num IN ('123')

答案 2 :(得分:0)

如果希望用户能够有效地查询连接值,则可以创建索引视图。可以根据需要添加其他视图列。请注意更新索引视图(https://msdn.microsoft.com/en-us/library/ms191432.aspx)引用的表的SET选项要求。如果您不使用SQL Server Enterprise或Developer Edition,则需要向查询添加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

答案 3 :(得分:0)

如果您一次只搜索一个值,则可以以编程方式分割值。这与其他答案类似,但会为您分配。

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