我有以下表结构:
当我将Id
列设置为主键时,它会自动在Indexes文件夹中创建名为PK_TestIndexTbl (Clustered)
的索引。我的表包含大约1,300,000条记录,当我执行以下查询时,大约需要5秒钟:
SELECT [Id], [Name], [Family], [Score]
FROM [TestIndexTbl]
但是当我从表中删除主键时,当然它会删除索引,我希望我的查询需要超过5秒,因为我现在没有任何索引。但它没有区别,我在5秒钟内得到了结果。为什么呢?
我的问题:如何查看索引使用情况?我应该运行什么查询来查看有无索引的区别?
Where
也没有效果。使用或不使用索引执行以下查询的时间不到一秒:
SELECT [Id], [Name], [Family], [Score]
FROM [TestIndexTbl]
where Id = 602145
答案 0 :(得分:4)
由于您选择了数据库中的所有条目,因此索引无关紧要。当它们按顺序存储并且不存在时,需要花费相同的时间才能将所有书籍从库中取出。
答案 1 :(得分:1)
您之前提到的索引与数据的保存方式有关。基本上,SQL Server中的索引是B +树结构。声明主键结构时,将创建聚簇索引,其中包含主键并将所有数据存储在B +树结构中。
基本上,有两种索引
一个表只能有一个最多聚簇索引,而它可以有多个非聚簇索引。
具有Clustered Index的表称为Clustered表,而没有聚簇索引的表称为Heap。数据存储在数据库的数据文件中的方式有很大差异。
但是,如果您的数据不是太多,无论您有堆还是群集,它都会产生任何影响。
在任何情况下,如果您请求所有数据(SELECT * FROM ...),时间将是相同的,因为将要执行的操作将是表扫描。 sql server的执行引擎必须访问包含数据的所有数据页。因此,您会发现任何差异。
如果您运行以下查询:
SELECT [Id], [Name], [Family], [Score]
FROM [TestIndexTbl]
WHERE Id = 602145
并且您有一个主键,那么用于检索数据的运算符是对聚簇索引的索引搜索。如果您没有聚簇索引,则运算符将是表扫描。如果您有一百万或记录,那么您会发现数据检索存在差异。
答案 2 :(得分:1)
如果要选择没有#import "Shopping_Cart.h"
@implementation Shopping_Cart
-(id)initWithItems:(NSMutableArray<Product*>*)items productPrice:(float)productPrice
{
self = [super init];
if(self)
{
self.items = items;
}
return self;
}
-(void)addItem:(Product*) product
{
NSLog(@"The item is added to your shopping cart!");
[self.items addObject:product];
}
-(float)calculatePurchase:(Product*) product
{
float totalPrice = 0.0;
for(int i = 0; i < self.items.count; i++)
{
totalPrice = totalPrice + self.items[i];
}
return totalPrice;
}
-(void)printProductName:(Product*)productName
{
NSLog(@"\n===================\n");
NSLog(@"Product Name: %@\n", self.productName);
NSLog(@"\n===================\n");
}
@end
子句的所有数据,它将选择所有行,聚簇索引对此没有影响。
选择没有聚簇索引的所有行甚至可能更快,因为你不太可能有碎片。
如果您的表缺少聚簇索引,则称为WHERE
。
尝试使用heap
进行选择,您将在具有聚集索引的表与不具有聚簇索引的表之间获得速度的主要差异。
有关差异的详细信息,请参阅here
答案 3 :(得分:0)
创建索引后不希望它会自动生效.. 索引在执行第二次或更多次后等待调用,看看执行它的时间比第一次更快。
有关详细信息,请参阅Index Type