8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何将值与表中包含通配符的值进行匹配

spd 2月前

68 0

假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。SearchVal AttachmentTest2 SomethingElse AttachmentTest% 给定字符串 Attachmen...

假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。

搜索值
附件测试2
其他
附件测试%

给定字符串 AttachmentTest2,我想要一个返回第一行和第三行的查询,本质上返回使用表中的表达式搜索时返回 AttachmentTest2 的任何行。

我试过

Select * from MyTable Where 'AttachmentTest2' like SearchVal

但它并没有给我所有匹配的结果,只有 AttachmentTest2。

这可以通过查询来实现吗?

帖子版权声明 1、本帖标题:如何将值与表中包含通配符的值进行匹配
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由spd在本站《sql-server》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @siggemannen - [文本在此处](URL 在此处)。(为了便于评论,我使用了 \\ 来转义这些字符。)

  • 我删除了之前的 fiddle 链接,因为它重复了 siggemannen 的评论。我正在重新发布一个

  • 既然表扫描和聚集索引扫描本质上都会扫描表中的所有记录,那么为什么聚集索引扫描会更好呢?举个例子 - 它们之间的性能差异是什么......

    既然 a Table Scan 和 a Clustered Index Scan 基本上都会扫描表中的所有记录,那么为什么聚集索引扫描会更好呢?

    举个例子 - 当有很多记录时,以下之间的性能差异是什么?:

    declare @temp table(
        SomeColumn varchar(50)
    )
    
    insert into @temp
    select 'SomeVal'
    
    select * from @temp
    
    -----------------------------
    
    declare @temp table(
        RowID int not null identity(1,1) primary key,
        SomeColumn varchar(50)
    )
    
    insert into @temp
    select 'SomeVal'
    
    select * from @temp
    
  • 在没有聚集索引的表(堆表)中,数据页没有链接在一起 - 因此遍历页面需要 查找索引分配图 .

    但是,聚簇表的 数据页链接在双向链表中 ,这使得顺序扫描速度更快。当然,作为交换,您需要处理保持数据页在 和 上的顺序的开销 INSERT , UPDATE DELETE 但是,堆表需要第二次写入 IAM。

    如果您的查询有一个 RANGE 运算符(例如 SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 :),那么聚簇表(按保证顺序排列)会更高效 - 因为它可以使用索引页来查找相关的数据页。堆必须扫描所有行,因为它不能依赖于排序。

    当然,聚集索引允许您执行聚集索引查找,这对于性能来说几乎是最佳的......没有索引的堆总是会导致表扫描。

    所以:

    • p5

    • p6

    • p7

    • p8

    微软有一份 白皮书 ,将聚集索引与堆上的等效非聚集索引进行了比较(与我上面讨论的并不完全相同,但很接近)。他们的结论基本上是在所有表上放置聚集索引。我会尽力总结他们的结果(再次注意,他们在这里实际上是在比较非聚集索引和聚集索引 - 但我认为它们是相对可比的):

    • INSERT 性能:由于堆需要第二次写入,因此聚集索引获胜约 3%。
    • UPDATE 性能:由于堆需要第二次查找,因此聚集索引获胜约 8%。
    • DELETE 性能:由于需要从 IAM 中对堆进行第二次查找和第二次删除,因此聚集索引获胜约 18%。
    • 单一 SELECT 性能:由于堆需要第二次查找,因此聚集索引获胜约 16%。
    • 范围 SELECT 性能:由于堆的随机排序,聚集索引获胜约 29%。
    • 并发 INSERT :由于聚集索引的页面拆分,堆表在负载下获胜 30%。
  • 今天这个问题突然出现在我的脑海里。感谢@Terrapin 提出这个问题,也感谢@Marc 的精彩回答!

  • MS 考试 70461 查询 Microsoft SQL Server 2012 - 第 15 章第 1 课有深入的开发。

  • OneQ 2月前 0 只看Ta
    引用 8

    我似乎无法获得您这句话所表明的所谓提升:“对于具有 WHERE 子句的查询,如果该子句至少可以部分地由聚集索引满足,则由于排序,您将领先 - 因此您不必扫描整个表。\'我有一张包含 1000 万行的表。无论我是否在 Id 上具有聚集索引,SE​​LECT Id FROM Customer WHERE Id > X 的执行时间都相同。为什么?但我可以看到它如何从表扫描变为聚集索引扫描。

  • @MattiasNordqvist - 如果你只是看所花费的时间,那你就做错了。由于缓存、并发访问、CPU 与磁盘时间等,很难仅根据时间对 MS-SQL 进行性能调整。查看 SET STATISTICS IO ON 以检查磁盘读取,这就是提升的来源。其次,这将取决于返回的行数 - 如果百分比足够高,优化器可能会选择读取 + 过滤器。

  • @MattiasNordqvist \'我有一张包含 1000 万行的表。无论我是否在 Id 上建立了聚集索引,SE​​LECT Id FROM Customer WHERE Id > X 的执行时间都相同。这是为什么?\'只有当聚集索引位于 \'Id\' 列上时,执行速度才会更快。

  • http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

    聚集索引扫描逻辑和物理运算符扫描 Argument 列中指定的聚集索引。当存在可选的 WHERE:() 谓词时,仅返回满足谓词的行。如果 Argument 列包含 ORDERED 子句,则查询处理器要求按照聚集索引对行进行排序的顺序返回行的输出。如果不存在 ORDERED 子句,则存储引擎将以最佳方式扫描索引(不保证输出已排序)。

    http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

    表扫描逻辑和物理运算符从 Argument 列中指定的表中检索所有行。如果 Argument 列中出现 WHERE:() 谓词,则仅返回满足谓词的行。

返回
作者最近主题: