--建表 create table tbTest ( T_ID int identity(1,1) primary key not null, TName varchar(20) not null, TAge int )--插入数据 create proc xx as declare @i int set @i=1 while @i<3000000 begin insert into tbTest values('kk',@i) set @i=@i+1 end go--执行查询 select * from tbTest where TAge>500000 and TAge<2500000--创建索引 create index aaaa on tbTest(Tage)--再次查询 select * from tbTest where TAge>500000 and TAge<2500000 两次查询速度一模一样!!
select * from tbTest (index =aaaa) where TAge>500000 and TAge<2500000
'index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号。有关正确的语法,请参阅 SQL Server 联机丛书。
SELECT IDD=IDENTITY(INT,1,1),* INTO #T FROM SYSCOLUMNS CREATE TABLE TB(NUM INT)INSERT TB SELECT IDD FROM #TSET STATISTICS TIME ON SELECT * FROM TB ORDER BY NUM SET STATISTICS TIME OFF CREATE INDEX NUM_INDEX ON TB(NUM DESC) SET STATISTICS TIME ON SELECT * FROM TB ORDER BY NUM DESC SET STATISTICS TIME OFF --DROP TABLE TB--DROP INDEX TB.NUM_INDEX用执行计划看看,
在有索引和无索引情况下测试这个sql: select * from tbTest where TAge=500000
不会用执行计划。请大哥就在我上面的例子上给指点一下吧。比如SQL语句应该怎么修改。谢谢!
select * from tbTest with(index =aaaa) where TAge>500000 and TAge<2500000
--修改 update tbTest set TName ='LLL' where T_ID>1000000 and T_ID<2000000--查询 select * from tbTest where TName='LLL'--创建索引 create index aaa on tbTest(Tname)--查询 select * from tbTest where TName='LLL' 两次查询时间仍然相同!
请看6L .--创建索引 create index aaaa on tbTest(Tage)我就是要影响查询的速度,然后来看一下用不用索引的效率差别。结果没差别。
索引不是万能的.如果你都用 SELECT * FROM Table WHERE 后跟一个很大的范围.是不会用到索引的(使用全表扫描). 具体情况具体分析的.
use tempdb go create table tbTest ( T_ID int identity(1,1) primary key not null, TName varchar(20) not null, TAge int )--插入数据declare @i int set @i=1 while @i<3000000 begin insert into tbTest values('kk',@i) set @i=@i+1 end goset statistics io on set statistics time on --执行查询 select * from tbTest where TAge=500000 /* (1 row(s) affected) 表 'tbTest'。扫描计数 9,逻辑读取 8678 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间: CPU 时间 = 735 毫秒,占用时间 = 100 毫秒。 */--创建索引 create index aaaa on tbTest(Tage) --再次查询 select * from tbTest where TAge=500000 /* (1 row(s) affected) 表 'tbTest'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 */ 上面的示例,已经说明利用了索引,由读 8678 个page减为6个page.不是所有的t-sql都会利用索引,比如你用select * from tbTest where TAge>1 用索引比不用还慢.
求大哥给出能清楚看出效率差别的SQL语句。谢谢
--建表
create table tbTest
(
T_ID int identity(1,1) primary key not null,
TName varchar(20) not null,
TAge int
)--插入数据
create proc xx
as
declare @i int
set @i=1
while @i<3000000
begin
insert into tbTest values('kk',@i)
set @i=@i+1
end
go--执行查询
select * from tbTest where TAge>500000 and TAge<2500000--创建索引
create index aaaa on tbTest(Tage)--再次查询
select * from tbTest where TAge>500000 and TAge<2500000
两次查询速度一模一样!!
'index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号。有关正确的语法,请参阅 SQL Server 联机丛书。
CREATE TABLE TB(NUM INT)INSERT TB SELECT IDD FROM #TSET STATISTICS TIME ON
SELECT * FROM TB ORDER BY NUM
SET STATISTICS TIME OFF
CREATE INDEX NUM_INDEX ON TB(NUM DESC)
SET STATISTICS TIME ON
SELECT * FROM TB ORDER BY NUM DESC
SET STATISTICS TIME OFF
--DROP TABLE TB--DROP INDEX TB.NUM_INDEX用执行计划看看,
select * from tbTest where TAge=500000
不会用执行计划。请大哥就在我上面的例子上给指点一下吧。比如SQL语句应该怎么修改。谢谢!
--修改
update tbTest set TName ='LLL' where T_ID>1000000 and T_ID<2000000--查询
select * from tbTest where TName='LLL'--创建索引
create index aaa on tbTest(Tname)--查询
select * from tbTest where TName='LLL'
两次查询时间仍然相同!
我测试了三遍with(index =aaaa) 有这个的时间,别没有的时间还要慢两秒!
那请大哥给个使用索引的SQL吧
做了索引,你这么大的量,可能会影响更新和插入的速度!
请看6L .--创建索引
create index aaaa on tbTest(Tage)我就是要影响查询的速度,然后来看一下用不用索引的效率差别。结果没差别。
go
create table tbTest
(
T_ID int identity(1,1) primary key not null,
TName varchar(20) not null,
TAge int
)--插入数据declare @i int
set @i=1
while @i<3000000
begin
insert into tbTest values('kk',@i)
set @i=@i+1
end
goset statistics io on
set statistics time on
--执行查询
select * from tbTest where TAge=500000
/*
(1 row(s) affected)
表 'tbTest'。扫描计数 9,逻辑读取 8678 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 735 毫秒,占用时间 = 100 毫秒。
*/--创建索引
create index aaaa on tbTest(Tage)
--再次查询
select * from tbTest where TAge=500000
/*
(1 row(s) affected)
表 'tbTest'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
*/
上面的示例,已经说明利用了索引,由读 8678 个page减为6个page.不是所有的t-sql都会利用索引,比如你用select * from tbTest where TAge>1
用索引比不用还慢.
仅供参考.
非聚集索引:适用于精确查找。create index aaaa on tbTest(Tage)
改成Create Clustered Index aaaa on tbTest(Tage)试试。