了解多列主键的结构
understanding the structure of primary key over multiple columns
我正在尝试了解 SQL 服务器中的索引如何帮助提高 select 查询的性能。
所以我的理解是 sql 服务器在索引时使用了 b 树结构。
下面是一个简单的例子。
Day (Primary Key) Race Winner
1 Dave
2 Jill
3 Jake
…
199 Jody
200 Sam
所以天数是我们的主键。在背景中使用了如下结构(或类似的东西——只是我找到的图像)。因此,如果想查询第 50 天的比赛获胜者,我可以使用下面的结构来查看它可以通过执行以下操作快速找到,
从根开始 > 下一个 1 – 100 > 下一个 1 – 50 & 然后进入叶 25 – 50,我相信它会搜索该叶中的数据行,直到找到第 50 天。此处包含的值是 50 还是指向包含该行其余数据的行的指针?
所以我可以看出这个例子比搜索整个 table 更快。但是我一直在寻找 table(简化版),如下所示,
Date ID SEC ID AutoID
10th Jan 2015 ABC A123 1
10th Jan 2015 ABC A344 2
10th Jan 2015 DEF A123 3
10th Jan 2015 GHJ A344 4
20th Feb 2015 ABC A123 5
20th Feb 2015 ABC A344 6
20th Feb 2015 DEF A123 7
20th Feb 2015 GHJ A344 8
所以我可以使用所有 3 列来创建一个主键(自然键)或者人们提到使用标识列,即代理键。
我在这里迷路了。
索引将如何存储此数据并能够像第一个示例中那样快速检索它? “2015 年 1 月 10 日 ABCA123”的键值实际上没有任何意义(我可能错误地假设这里发生了什么——我相信索引结合了三列来创建一个唯一的值,并将其放入索引 table).在第一个示例中,我们的索引值实际上对数据有某种意义,即天数。
我也不明白sql服务器如何使用AutoID?在查询上面的数据时,我会在 where 条件中使用日期和 ID 列,所以 AutoID 似乎毫无意义?
Is the value contained here 50 & a pointer to the row which contains the rest of the data on that row?
视情况而定。在一个table(只能有一个)的聚簇索引中,叶子存储的是整行的数据。聚集索引是数据实际存储的地方。在非聚集索引中,叶子存储的是聚集索引列值,因此可以进行查找。
默认情况下,主键将成为聚簇索引,但这只是默认情况,因此任何一种情况都可能发生。
在多列索引中,是的,索引级别中存储的实际上是所有列的组合值。这就是为什么对于多列索引,索引仅在索引的最左边 n 列(n <= 数量索引中的列)用于搜索条件。
在您的第二个示例中,如果索引是按 Date
、ID
和 SEC ID
定义的,并且您有一个带有 WHERE
的查询ID = 'ABC'
的子句那么索引就不能使用了——因为每个键的第一部分是 Date
.
我正在尝试了解 SQL 服务器中的索引如何帮助提高 select 查询的性能。
所以我的理解是 sql 服务器在索引时使用了 b 树结构。
下面是一个简单的例子。
Day (Primary Key) Race Winner
1 Dave
2 Jill
3 Jake
…
199 Jody
200 Sam
所以天数是我们的主键。在背景中使用了如下结构(或类似的东西——只是我找到的图像)。因此,如果想查询第 50 天的比赛获胜者,我可以使用下面的结构来查看它可以通过执行以下操作快速找到,
从根开始 > 下一个 1 – 100 > 下一个 1 – 50 & 然后进入叶 25 – 50,我相信它会搜索该叶中的数据行,直到找到第 50 天。此处包含的值是 50 还是指向包含该行其余数据的行的指针?
所以我可以看出这个例子比搜索整个 table 更快。但是我一直在寻找 table(简化版),如下所示,
Date ID SEC ID AutoID
10th Jan 2015 ABC A123 1
10th Jan 2015 ABC A344 2
10th Jan 2015 DEF A123 3
10th Jan 2015 GHJ A344 4
20th Feb 2015 ABC A123 5
20th Feb 2015 ABC A344 6
20th Feb 2015 DEF A123 7
20th Feb 2015 GHJ A344 8
所以我可以使用所有 3 列来创建一个主键(自然键)或者人们提到使用标识列,即代理键。
我在这里迷路了。
索引将如何存储此数据并能够像第一个示例中那样快速检索它? “2015 年 1 月 10 日 ABCA123”的键值实际上没有任何意义(我可能错误地假设这里发生了什么——我相信索引结合了三列来创建一个唯一的值,并将其放入索引 table).在第一个示例中,我们的索引值实际上对数据有某种意义,即天数。
我也不明白sql服务器如何使用AutoID?在查询上面的数据时,我会在 where 条件中使用日期和 ID 列,所以 AutoID 似乎毫无意义?
Is the value contained here 50 & a pointer to the row which contains the rest of the data on that row?
视情况而定。在一个table(只能有一个)的聚簇索引中,叶子存储的是整行的数据。聚集索引是数据实际存储的地方。在非聚集索引中,叶子存储的是聚集索引列值,因此可以进行查找。
默认情况下,主键将成为聚簇索引,但这只是默认情况,因此任何一种情况都可能发生。
在多列索引中,是的,索引级别中存储的实际上是所有列的组合值。这就是为什么对于多列索引,索引仅在索引的最左边 n 列(n <= 数量索引中的列)用于搜索条件。
在您的第二个示例中,如果索引是按 Date
、ID
和 SEC ID
定义的,并且您有一个带有 WHERE
的查询ID = 'ABC'
的子句那么索引就不能使用了——因为每个键的第一部分是 Date
.