假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。SearchVal AttachmentTest2 SomethingElse AttachmentTest% 给定字符串 Attachmen...
假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。
给定字符串 AttachmentTest2,我想要一个返回第一行和第三行的查询,本质上返回使用表中的表达式搜索时返回 AttachmentTest2 的任何行。
我试过
Select * from MyTable Where 'AttachmentTest2' like SearchVal
但它并没有给我所有匹配的结果,只有 AttachmentTest2。
这可以通过查询来实现吗?
@siggemannen - [文本在此处](URL 在此处)。(为了便于评论,我使用了 \\ 来转义这些字符。)
我删除了之前的 fiddle 链接,因为它重复了 siggemannen 的评论。我正在重新发布一个
既然表扫描和聚集索引扫描本质上都会扫描表中的所有记录,那么为什么聚集索引扫描会更好呢?举个例子 - 它们之间的性能差异是什么......
既然 a Table Scan 和 a Clustered Index Scan 基本上都会扫描表中的所有记录,那么为什么聚集索引扫描会更好呢?
Table Scan
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。
INSERT
UPDATE
DELETE
如果您的查询有一个 RANGE 运算符(例如 SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 :),那么聚簇表(按保证顺序排列)会更高效 - 因为它可以使用索引页来查找相关的数据页。堆必须扫描所有行,因为它不能依赖于排序。
RANGE
SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
当然,聚集索引允许您执行聚集索引查找,这对于性能来说几乎是最佳的......没有索引的堆总是会导致表扫描。
所以:
p5
p6
p7
p8
微软有一份 白皮书 ,将聚集索引与堆上的等效非聚集索引进行了比较(与我上面讨论的并不完全相同,但很接近)。他们的结论基本上是在所有表上放置聚集索引。我会尽力总结他们的结果(再次注意,他们在这里实际上是在比较非聚集索引和聚集索引 - 但我认为它们是相对可比的):
SELECT
今天这个问题突然出现在我的脑海里。感谢@Terrapin 提出这个问题,也感谢@Marc 的精彩回答!
MS 考试 70461 查询 Microsoft SQL Server 2012 - 第 15 章第 1 课有深入的开发。
我似乎无法获得您这句话所表明的所谓提升:“对于具有 WHERE 子句的查询,如果该子句至少可以部分地由聚集索引满足,则由于排序,您将领先 - 因此您不必扫描整个表。\'我有一张包含 1000 万行的表。无论我是否在 Id 上具有聚集索引,SELECT Id FROM Customer WHERE Id > X 的执行时间都相同。为什么?但我可以看到它如何从表扫描变为聚集索引扫描。
@MattiasNordqvist - 如果你只是看所花费的时间,那你就做错了。由于缓存、并发访问、CPU 与磁盘时间等,很难仅根据时间对 MS-SQL 进行性能调整。查看 SET STATISTICS IO ON 以检查磁盘读取,这就是提升的来源。其次,这将取决于返回的行数 - 如果百分比足够高,优化器可能会选择读取 + 过滤器。
@MattiasNordqvist \'我有一张包含 1000 万行的表。无论我是否在 Id 上建立了聚集索引,SELECT 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:() 谓词,则仅返回满足谓词的行。