当前位置: 代码迷 >> Sql Server >> 目录到底有多大作用
  详细解决方案

目录到底有多大作用

热度:21   发布时间:2016-04-24 10:21:54.0
索引到底有多大作用?
 索引到底有多大作用?  对查询速度能提升多少?

随着单表数据量的增加,就算有索引,查询速度不还是越来越慢的吗???
------解决方案--------------------
索引到底有多大作用?
--> 提升查询的速度,降低DML的速度.

 对查询速度能提升多少?
--> 需看具体情况,表结构,数据量,查询语句..

随着单表数据量的增加,就算有索引,查询速度不还是越来越慢的吗???
--> 是的,随数据量的增加,比没有索引时查询速度的提升是越来越明显的.
------解决方案--------------------
没索引,查一次平均需要访问、比较一半的记录(n/2)
有索引,通过二分查询,只需要访问、比较的根?幂记录ln2(n)

举个例子,10亿条记录
没索引,要比较5亿次
有索引,只要ln2(10亿)即28次
你看速度提升了多少倍?
------解决方案--------------------
从实践来说,单表10亿条数据可能才能达到关系数据库的索引极限,大部分情况下,合理的索引能把查询从数个小时降到数秒,我以前改过一个报表,改的是写法加索引,从30多个小时降到33秒
------解决方案--------------------
前人的总结,我贴过来给你看下
索引之所以快,是因为只需要访问这个表中的少量数据。

比如你说你的表有500万条数据,那么一般如果你只是访问其中的10%左右的数据,那么用索引才会显的比较快,比如:

select * from 表 where 加索引的那一列 = xxx

或者

select * from 表 where 加索引的那一列 between 123 and 456

这样查询才能快。

如果是:

select * from 表 速度肯定是一样的。

--

“不是说索引会提高查询速度吗?”
索引不一定会提高性能,合适的索引才会提高性能

这个涉及执行成本的问题,
当需要返回的数据量大于总数据量的20%时,系统会直接全表扫描而不用索引.

所以即使有索引的情况下,执行执行select * from [表名],也会走全表扫描的.



------解决方案--------------------
给个大概的例子,但是注意这个测试并不非常精确,你可以对比两者的时间和逻辑读部分:

USE tempdb
GO
IF OBJECT_ID('tempdb..testTB','u')IS NOT NULL 
DROP TABLE testTB
CREATE TABLE testTB(id INT ,NAME VARCHAR(100))
--产生50万数据的测试表
INSERT INTO testTB
select TOP 500000 a.id,a.name
FROM sys.syscolumns a CROSS JOIN  sys.syscolumns b


--没有索引下,查看时间及IO情况
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT id
FROM testTb
WHERE id <10 
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;

/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(43554 行受影响)
表 'testTB'。扫描计数 1,逻辑读取 1512 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 79 毫秒,占用时间 = 570 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

*/

--在ID列建一个索引
CREATE NONCLUSTERED INDEX test ON testTb(id)

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT id
FROM testTb
WHERE id <10 
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;

/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 3 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(43554 行受影响)
表 'testTB'。扫描计数 1,逻辑读取 101 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 490 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
*/
  相关解决方案