代码之家  ›  专栏  ›  技术社区  ›  Robert Koritnik

LEFT()与LIKE运算符的T-SQL速度比较

  •  12
  • Robert Koritnik  · 技术社区  · 14 年前

    我正在创建基于 nvarchar 而不是通常的一栏,那通常是关于页数的结果。

    LIKE 运算符或等式( = )接线员。

    select *
    from table
    where name like @firstletter + '%'
    

    select *
    from table
    where left(name, 1) = @firstletter
    

    我试过在网上搜索两者的速度比较,但很难找到任何结果,因为大多数搜索结果都与 LEFT JOINs 而不是 LEFT 功能。

    4 回复  |  直到 14 年前
        1
  •  8
  •   paxdiablo    14 年前

    最好的办法是根据实际生产数据来衡量性能,而不是试图猜测(或询问我们)。这是因为性能有时取决于您正在处理的数据,尽管在这种情况下似乎不太可能(但我不这么认为 知道

    如果这是一个您将要做很多工作的查询,您应该考虑另一个(索引的)列,其中包含 name 并通过一个insert/update触发器设置它。

    这将以最小的存储增加为代价,使此查询盲目快速:

    select * from table where name_first_char_lower = @firstletter
    

    这是因为大多数数据库的读取频率远远高于写入频率,这将在所有读取中分摊计算成本(仅用于写入)。

    它引入了冗余数据,但只要您理解(并减轻,如本建议中所述)后果和 额外的表演。

        2
  •  13
  •   user3810913 user3810913    10 年前

    不是函数 因此可以利用数据上的任何索引。

    This web page 用一些例子描述用法的不同。这意味着SQL server必须为返回的每个记录计算函数。

    “Substring”和其他类似的函数也是罪魁祸首。

        3
  •  4
  •   PCSgtL    11 年前

    我有一个类似的问题,对两个都进行了测试。这是我的密码。

    where (VOUCHER like 'PCNSF%'
        or voucher like 'PCLTF%'
        or VOUCHER like 'PCACH%'
        or VOUCHER like 'PCWP%'
        or voucher like 'PCINT%')
    

    在1分51秒内返回1434行。

    where (LEFT(VOUCHER,5) = 'PCNSF'
        or LEFT(VOUCHER,5)='PCLTF'
        or LEFT(VOUCHER,5) = 'PCACH'
        or LEFT(VOUCHER,4)='PCWP'
        or LEFT (VOUCHER,5) ='PCINT')
    

    在1分27秒内返回1434行

    我的数据用左边的5更快。顺便提一下,我的整个查询确实命中了一些索引。

        4
  •  1
  •   Kannan.C    8 年前

    当搜索列包含索引时,我总是建议使用like运算符。我在我的生产环境中使用select count(column_name)from table_name where left(column_name,3)=“AAA”或left(column_name,3)=“ABA”或。。。最多9个或条款。“我的计数”显示7301477条记录,左4秒,右1秒,即列名称如“AAA%”,列名称如“ABA%”,或。。。最多9个类似条款。

    在where子句中调用函数不是最佳实践。参考 http://blog.sqlauthority.com/2013/03/12/sql-server-avoid-using-function-in-where-clause-scan-to-seek/

        5
  •  0
  •   Simon_Weaver    5 年前

    实体框架核心用户

    EF.Functions.Like(columnName, searchString + "%") 而不是 columnName.startsWith(...) 你将在生成的SQL中得到一个LIKE函数,而不是所有这些“左”的疯狂!

    根据需要,您可能需要预处理searchString。

    https://github.com/aspnet/EntityFrameworkCore/issues/7429

    此函数不在实体框架中(非核心) EntityFunctions 所以我不知道如何为EF6做。