Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008性能:无索引与坏索引?_Sql Server_Sql Server 2008_Indexing - Fatal编程技术网

Sql server SQL Server 2008性能:无索引与坏索引?

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来重置缓存,所以我有点迷路了 这可能是什么原因造成的? 我知道索引的构造很差(每个相关字段都有一个索引),

我在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