繁体   English   中英

在SQL Server(2008)上,如果我想过滤以某事开头的字符串字段,那么最好的方法是什么?

[英]On SQL Server (2008), if I want to filter a string field that starts with something, what is the best way?

在几个SQL查询中,我需要检查字段是否以字符开头。 有几种方法可以做到,哪一种方法在性能/标准方面更好?

我经常使用

tb.field LIKE 'C%'

但我也可以用

LEFT(LTRIM(tb.Field),1) = 'C'

我很清楚每种情况的用途,但不是在性能方面。

我会选择第一个LIKE C% ,如果有一个索引,它将在该字段上使用索引,而不是必须进行全表扫描。

如果您确实需要在查询中包含空白LTRIM修剪,则可以创建一个值为LEFT(LTRIM(tb.Field), 1)的持久计算列,并在其上放置索引。

LIKE 'C%'表现要好于LEFT(LTRIM())

LIKE谓词仍然可以使用支持索引来获取您正在查找的数据。 一世

但是,当SQL Server遇到LEFT(LTRIM(tb.Field), 1) = 'C' ,数据库无法确定您的意思。 为了执行匹配,SQL Server必须扫描每一行, LTRIM数据然后检查第一个字符。 最终结果很可能是全表扫描。

第一个查询比另一个查询稍微多一点。 我用我的查询速度测量脚本测量了它。 亲自尝试一下:

DECLARE @Measurements TABLE(
    MeasuredTime INT NOT NULL
)

DECLARE @ExecutionTime INT
DECLARE @TimesMeasured INT
SET @TimesMeasured = 0


WHILE @TimesMeasured < 1000
BEGIN
    DECLARE @StartTime DATETIME

    SET @StartTime = GETDATE()

    -- your select .. or what every query 

    INSERT INTO @Measurements
    SELECT  DATEDIFF(millisecond, @StartTime, getdate())

    SET @TimesMeasured = @TimesMeasured + 1
END

SELECT @AvgTime = AVG(MeasuredTime) FROM @Measurements

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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