Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 Server:通配符惩罚_Sql Server_Performance_Tsql_Wildcard - Fatal编程技术网

Sql server SQL Server:通配符惩罚

Sql server SQL Server:通配符惩罚,sql-server,performance,tsql,wildcard,Sql Server,Performance,Tsql,Wildcard,我需要知道SQL Server是否会因为在WHERE子句中使用通配符或复制相同的筛选器而受到严重的性能损失 在WHERE语句中有两个变量,它们由存储过程代码控制。我需要知道这些查询是否会导致性能问题 清单1 declare @filter1 varchar(20) declare @filter2 varchar(20) (...) set @filter2 = @filter1 (...) select Col1, Col2, Col3 from Table1 where Col1 like

我需要知道SQL Server是否会因为在
WHERE
子句中使用通配符或复制相同的筛选器而受到严重的性能损失

WHERE
语句中有两个变量,它们由存储过程代码控制。我需要知道这些查询是否会导致性能问题

清单1

declare @filter1 varchar(20)
declare @filter2 varchar(20)
(...)
set @filter2 = @filter1
(...)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 or Col1 like @filter2
清单2

declare @filter1 varchar(20)
declare @filter2 varchar(20)
(...)
set @filter2 = '%'
(...)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2

我知道你可能会问我为什么要使用这种奇怪的代码。根据传递给存储过程的第一个变量,我有不同数量的过滤器,我需要任意分配第二个过滤器。但有时不需要第二个过滤器。我在
WHERE
子句中查看了使用
CASE
,但是尽管在这个门户上有积极的反馈,
CASE
在这里不起作用。

关于数据库要记住的是,性能几乎完全是由索引驱动的。良好的索引和使用=良好的性能。错误的索引或使用=错误的性能。在优化查询时,您所做的很多工作只是编写查询以更好地与索引对齐,或者修改索引以更好地与查询对齐

前导通配符阻止您使用正常索引!因此,是的,这很可能会导致严重的性能损失

超越通配符:即使是
条件也会降低Sql Server使用索引的可能性。你可以考虑写这样的查询:

select Col1, Col2, Col3
from Table1
where Col1 like @filter1

union

select Col1, Col2, Col3
from Table1
where Col1 like @filter2
要向Sql Server说明它可以使用索引,请执行以下操作:

Set @filter2 = COALESCE(@filter2, @filter1)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
如果可能,请再次使用尾随通配符。这对于索引仍然不是很好,但总比没有好


如果这是一个非常大的文本/ VARCHAR(max)类型的列,您也应该考虑。

< P>数据库中要记住的是,性能几乎完全由<强>索引< <强> >驱动。良好的索引和使用=良好的性能。错误的索引或使用=错误的性能。在优化查询时,您所做的很多工作只是编写查询以更好地与索引对齐,或者修改索引以更好地与查询对齐

前导通配符阻止您使用正常索引!因此,是的,这很可能会导致严重的性能损失

超越通配符:即使是
条件也会降低Sql Server使用索引的可能性。你可以考虑写这样的查询:

select Col1, Col2, Col3
from Table1
where Col1 like @filter1

union

select Col1, Col2, Col3
from Table1
where Col1 like @filter2
要向Sql Server说明它可以使用索引,请执行以下操作:

Set @filter2 = COALESCE(@filter2, @filter1)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
如果可能,请再次使用尾随通配符。这对于索引仍然不是很好,但总比没有好


如果这是一个非常大的文本/ VARCHAR(max)类型的列,您也应该考虑。

< P>数据库中要记住的是,性能几乎完全由<强>索引< <强> >驱动。良好的索引和使用=良好的性能。错误的索引或使用=错误的性能。在优化查询时,您所做的很多工作只是编写查询以更好地与索引对齐,或者修改索引以更好地与查询对齐

前导通配符阻止您使用正常索引!因此,是的,这很可能会导致严重的性能损失

超越通配符:即使是
条件也会降低Sql Server使用索引的可能性。你可以考虑写这样的查询:

select Col1, Col2, Col3
from Table1
where Col1 like @filter1

union

select Col1, Col2, Col3
from Table1
where Col1 like @filter2
要向Sql Server说明它可以使用索引,请执行以下操作:

Set @filter2 = COALESCE(@filter2, @filter1)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
如果可能,请再次使用尾随通配符。这对于索引仍然不是很好,但总比没有好


如果这是一个非常大的文本/ VARCHAR(max)类型的列,您也应该考虑。

< P>数据库中要记住的是,性能几乎完全由<强>索引< <强> >驱动。良好的索引和使用=良好的性能。错误的索引或使用=错误的性能。在优化查询时,您所做的很多工作只是编写查询以更好地与索引对齐,或者修改索引以更好地与查询对齐

前导通配符阻止您使用正常索引!因此,是的,这很可能会导致严重的性能损失

超越通配符:即使是
条件也会降低Sql Server使用索引的可能性。你可以考虑写这样的查询:

select Col1, Col2, Col3
from Table1
where Col1 like @filter1

union

select Col1, Col2, Col3
from Table1
where Col1 like @filter2
要向Sql Server说明它可以使用索引,请执行以下操作:

Set @filter2 = COALESCE(@filter2, @filter1)
select Col1, Col2, Col3
from Table1
where Col1 like @filter1 and Col1 like @filter2
如果可能,请再次使用尾随通配符。这对于索引仍然不是很好,但总比没有好


如果这是一个非常大的文本/ VARCHAR(max)类型的列,您也应该考虑。

只是一个旁注:DBMS甚至可以为一个领先的WiLDARD使用索引。但对于SQL Server,您的语句绝对正确。只需完成您的回答:您可以创建一个反向索引来管理前导通配符。相反,没有机会改进双通配符(前导和尾随),只需稍加措辞调整即可允许前导通配符出现(罕见的)例外情况。只需补充说明:有些DBMS甚至可以对前导通配符使用索引。但对于SQL Server,您的语句绝对正确。只需完成您的回答:您可以创建一个反向索引来管理前导通配符。相反,没有机会改进双通配符(前导和尾随),只需稍加措辞调整即可允许前导通配符出现(罕见的)例外情况。只需补充说明:有些DBMS甚至可以对前导通配符使用索引。但对于SQL Server,您的语句绝对正确。只需完成您的回答:您可以创建一个反向索引来管理前导通配符。相反,没有机会改进双通配符(前导和尾随),只需稍加措辞调整即可允许前导通配符出现(罕见的)例外情况。只需补充说明:有些DBMS甚至可以对前导通配符使用索引。但对于SQL Server,您的陈述是绝对正确的。只需完成您的回答:您可以创建一个反向索引来