假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。SearchVal AttachmentTest2 SomethingElse AttachmentTest% 给定字符串 Attachmen...
假设我有一张表,其中包含一个带有值的列。其中一些值中嵌入了通配符。
搜索值 |
---|
附件测试2 |
其他 |
附件测试% |
给定字符串 AttachmentTest2,我想要一个返回第一行和第三行的查询,本质上返回使用表中的表达式搜索时返回 AttachmentTest2 的任何行。
我试过
Select * from MyTable Where 'AttachmentTest2' like SearchVal
但它并没有给我所有匹配的结果,只有 AttachmentTest2。
这可以通过查询来实现吗?
在没有聚集索引的表(堆表)中,数据页没有链接在一起 - 因此遍历页面需要 查找索引分配图 .
但是,聚簇表的 数据页链接在双向链表中 ,这使得顺序扫描速度更快。当然,作为交换,您需要处理保持数据页在 和 上的顺序的开销 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%。