Sql server SQL Server 2008性能:无索引与坏索引?
我在Microsoft SQL Server 2008中遇到了一个奇怪的问题。 我有一个大约有10个表的大型数据库(20GB),我试图说明如何正确创建索引 我的问题是:在一些嵌套查询中,我在不使用索引的情况下获得更快的结果!很接近(一两秒),但在某些情况下,完全不使用索引似乎会使这些查询运行得更快。。。在运行脚本之前,我正在运行checkpount和DBCC dropcleanbuffers来重置缓存,所以我有点迷路了 这可能是什么原因造成的? 我知道索引的构造很差(每个相关字段都有一个索引),关键是要证明正确构造索引的重要性,但它应该永远不会比根本没有索引慢,对吗 编辑:以下是一个有罪的疑问:Sql server SQL Server 2008性能:无索引与坏索引?,sql-server,sql-server-2008,indexing,Sql Server,Sql Server 2008,Indexing,我在Microsoft SQL Server 2008中遇到了一个奇怪的问题。 我有一个大约有10个表的大型数据库(20GB),我试图说明如何正确创建索引 我的问题是:在一些嵌套查询中,我在不使用索引的情况下获得更快的结果!很接近(一两秒),但在某些情况下,完全不使用索引似乎会使这些查询运行得更快。。。在运行脚本之前,我正在运行checkpount和DBCC dropcleanbuffers来重置缓存,所以我有点迷路了 这可能是什么原因造成的? 我知道索引的构造很差(每个相关字段都有一个索引),
SET STATISTICS TIME ON
SET STATISTICS IO ON
USE DBX;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
DBCC FREEPROCCACHE;
GO
SELECT * FROM Identifier where CarId in (SELECT CarID from Car where ManufactId = 14) and DataTypeId = 1
标识符表:
-IdentifierId int不为空
-CarId int不为空
-DataTypeId int不为空
-别名nvarchar(300)
轿厢台:
-CarId int不为空
-ManufactId int不为空
-(后面有几个字段,全部为nvarchar(100)
这些要点中的每一个都有一个索引,以及一些一次同时存储其中两个的索引(例如CarId和DataTypeId)
最后,identifier表有超过一百万个条目,而Car表有两百万或三百万个条目。检查执行计划,看看它是否使用了这些您“知道”的坏索引之一 通常,索引会减慢数据写入速度,并有助于加快数据读取速度
因此,是的,我同意你的看法。它应该永远不会比没有索引慢。检查执行计划,看看它是否使用了你“知道”的这些索引中的一个是坏的 通常,索引会减慢数据写入速度,并有助于加快数据读取速度
因此,是的,我同意你的看法。它应该永远不会比没有索引慢。通常SQL Server在决定使用什么索引(如果有)以最快的方式检索数据方面做得很好。它通常会决定不使用任何索引,因为它可以更快地从小表中检索少量数据,而无需g转向索引(在某些情况下) 在您的情况下,SQL可能没有采用最佳的路由。创建了大量糟糕的索引可能会导致它选择错误的路由来访问数据 我建议您在ManagementStudio中查看查询计划,以检查它使用了哪些索引,以及花费了多少时间。这应该会让您知道从哪里开始
另一个注意事项是,这些索引可能随着时间的推移而变得支离破碎,现在的性能并没有达到最佳状态,可能值得检查这一点,并在需要时重建其中的一些索引。通常SQL Server在决定使用什么索引(如果有的话)以最快的方式检索数据方面做得很好。通常,它会决定不使用索引ny索引,因为它可以更快地从小表中检索少量数据,而无需转到索引(在某些情况下) 在您的情况下,SQL可能没有采用最佳的路由。创建了大量糟糕的索引可能会导致它选择错误的路由来访问数据 我建议您在ManagementStudio中查看查询计划,以检查它使用了哪些索引,以及花费了多少时间。这应该会让您知道从哪里开始
另一个值得注意的是,这些索引可能随着时间的推移变得支离破碎,现在没有发挥出最好的性能,如果需要的话,可能值得检查并重新构建其中的一些索引。在你有很多记录之前,索引实际上没有任何好处。我说很多是因为我真的不知道临界点是什么……这取决于n具体应用和情况 SQL Server处理索引确实需要时间。如果这一时间超过了好处……在子查询中尤其如此,在子查询中,微小的差异会成倍增加
如果没有索引效果更好,那么就不要使用索引。除非你有很多记录,否则索引实际上没有任何好处。我说很多是因为我真的不知道临界点是什么……这取决于具体的应用和环境 SQL Server处理索引确实需要时间。如果这一时间超过了好处……在子查询中尤其如此,在子查询中,微小的差异会成倍增加
如果在没有索引的情况下效果更好,请忽略索引。也尝试清除执行计划缓存。也尝试清除执行计划缓存。这是一个空泛的猜测。可能如果您有很多索引,SQL Server会花时间分析和选择一个,然后拒绝所有索引。如果您没有索引,引擎就不必浪费时间在这个审查过程中了
我不知道这个审查过程实际需要多长时间。这是一个空泛的猜测。也许如果你有很多索引,SQL Server会花时间分析和挑选一个,然后拒绝所有索引。如果你没有索引,引擎就不必在这个审查过程中浪费时间
我不知道这个审查过程实际需要多长时间。对于一些查询,直接从表中读取(聚集索引扫描)比从表中读取索引和获取记录(索引扫描+书签查找)要快 假设一条记录与数据页中的其他记录一起存在。数据页是IO的基本单位。如果直接读取表,则可以用1个IO的成本获得10条记录。如果直接读取索引,然后从表中提取记录,则必须为每条记录支付1个IO 通常SQL server非常擅长选择访问表的最佳方式(直接与索引)。
SET SHOWPLAN_ALL ON
SELECT
my_string1,
my_string2
FROM
My_Table
WHERE
my_date > '2000-01-01'
SELECT i.*
FROM Identifier i
inner join Car c
on i.CarID=c.CarID
where c.ManufactId = 14 and i.DataTypeId = 1