sql-server 如何使用'column 1 + column 2 =@variable'快速获得结果

moiiocjp  于 2022-10-31  发布在  其他
关注(0)|答案(3)|浏览(232)

我正在使用SQL Server 2016。我有一个超过1000万行的表。当我想用查询显示在这里搜索时,它非常慢。

CREATE TABLE dbo.table_name
(
    Col1 int NOT NULL,
    Col2 int NULL,
    Col3 char(2) NULL,
    Col4 char(15) NULL,
    Col5 varchar(8) NULL,
    Col6 varchar(12) NULL,
    Col7 varchar(8) NULL,
    Col8 int NULL,
    Col9 int NULL,
    Col10 varchar(16) NOT NULL
) ON PRIMARY

SELECT
    colum3 + column4 
FROM
    tablename 
WHERE
    column3 + column4 = @variable

我应该使用什么索引方法来加快此查询的速度?(两列中的varchar类型)

3qpi33ja

3qpi33ja1#

也许你可以考虑一个计算列和索引。

ALTER TABLE dbo.tablename ADD concat_column AS
  CONCAT(column1 + column2);

CREATE INDEX ix_concat_column ON dbo.tablename(concat_column)
  INCLUDE ...

不确定单独列上的索引是否会有很大帮助,因为它仍然必须对每一对执行concat(认为'Rhy' + 'thm''R' + 'hythm'相同)。

nafvub8i

nafvub8i2#

没有什么好方法可以做到这一点,但您有几个选择。
问题是查询必须连接数据库中每一行的col 3和col 4,并将其与变量进行比较。连接意味着它不会使用索引。执行此操作的时间将随行数线性增加。
首先,如果您在第3列和第4列上创建索引,并将查询更改为

select concat(col3, col4) 
from table_name 
where (
   col3 like left(@variable, 3)
   or col4 like left(@variable, 3)
and concat(col3, col4) = @variable

您应该会在速度上得到相当大的改进。这是因为第一个where子句可以使用索引,并且 * 应该 * 减少查询必须连接col 3和col 4的行数。我建议使用@variable的前3个字符-调整到任何有效的字符。
第二种选择是创建一个视图,将column 3和column 4连接成一个新列,并对该列执行create an index,这 * 应该 * 非常快。

fslejnso

fslejnso3#

该模型表明Col3和Col4值的长度始终为2和15个字符。
如果是这种情况,您可以添加一个包含这两个列的索引,并在where子句中分别使用它们。
如何处理Null值仍有待解决。

CREATE INDEX idx_myindex ON dbo.tablename(Col1, Col2);
GO

SELECT
    Concat(colum3, column4) 
FROM
    tablename 
WHERE
    column3 = left(@variable,2) and (column4 = right(@variable,15)

基于相同假设的解处理Null值。

SELECT
    Concat(colum3, column4) 
FROM
    tablename 
WHERE
    ( Len(@variable) = 17 AND 
      column3 = left(@variable,2) and (column4 = right(@variable,15) )
    OR
    ( Len(@variable) = 2 AND
      column3 = @variable AND column4 is null )
    OR
    ( Len(@variable) = 15 AND
      column3 is null AND column4 = @variable )

相关问题