SQL查询效率:100w数据查询只需要1秒钟
作者:晨夕 发布时间:2008-12-09 14:36:00
关于SQL查询效率,100w数据,查询只要1秒,与您分享:
机器情况:
p4: 2.4
内存: 1 G
os: windows 2003
数据库:
SQL Server 2000
目的: 查询性能测试,比较两种查询的性能
SQL查询效率 step by step
-- setp 1.
-- 建表
create table t_userinfo
(
userid int identity(1,1) primary key nonclustered,
nick varchar(50) not null default '',
classid int not null default 0,
writetime datetime not null default getdate()
)
go
-- 建索引
create clustered index ix_userinfo_classid on t_userinfo(classid)
go
-- step 2.
declare @i int
declare @k int
declare @nick varchar(10)
set @i = 1
while @i<1000000
begin
set @k = @i % 10
set @nick = convert(varchar,@i)
insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate())
set @i = @i + 1
end
-- 耗时 08:27 ,需要耐心等待
-- step 3.
select top 20 userid,nick,classid,writetime from t_userinfo
where userid not in
(
select top 900000 userid from t_userinfo order by userid asc
)
-- 耗时 8 秒 ,够长的
-- step 4.
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 900020 userid from t_userinfo order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 耗时 1 秒,太快了吧,不可以思议
-- step 5 where 查询
select top 20 userid,nick,classid,writetime from t_userinfo
where classid = 1 and userid not in
(
select top 90000 userid from t_userinfo
where classid = 1
order by userid asc
)
-- 耗时 2 秒
-- step 6 where 查询
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 90000 userid from t_userinfo
where classid = 1
order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 查询分析器显示不到 1 秒.
查询效率分析:
子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。在这种情况下可以考虑用联接查询来取代。
如果要用子查询,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因为EXISTS引入的子查询只是测试是否存在符合子查询中指定条件的行,效率较高。无论在哪种情况下,NOT IN都是最低效的。因为它对子查询中的表执行了一个全表遍历。
建立合理的索引,避免扫描多余数据,避免表扫描!
几百万条数据,照样几十毫秒完成查询。


猜你喜欢
- SAX将dd.xml解析成html。当然啦,如果得到了xml对应的xsl文件可以直接用libxml2将其转换成html。#!/usr/bin
- 一、标识符何为标识符?标识符是用来标识某个实体的一个符号。在编程语言中,标识符是计算机语言中作为名字的有效字符串集合。标识符是用户编程时使用
- 示例1:pycallclass.cpp:#include <iostream>using namespace std;typed
- 本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下1、解释一下 WSGI 和 FastCGI
- 利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法。我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站
- 0. 命令行参数通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚
- 编写聊天程序的服务端代码和客户端代码。完成后,先启动服务端代码,然 后启动客户端程序输人问题,服务端可以返回相应的答案。要求服务端代码具 有
- 本文实例讲述了php实现比较全的数据库操作类。分享给大家供大家参考。具体如下:<?php class database {  
- 从这次开始,我会由简单到困难(其实也不会困难到哪里去)讲几个例程,每一个例程都是我自己写(或者修改,那样的话我会提供原始出处)的,都具有一定
- 问题你想在一个消息传输层如 sockets 、multiprocessing connections 或 ZeroMQ 的基础之上实现一个简
- 普通关闭我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysq
- django-pagination这是一个python包,来自github上的一个项目,很容易用。不过这是一个懒人工具,好吧(工具理性)。不
- 以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3],如下:>>>
- 本文实例为大家分享了OpenCV+face++实现实时人脸识别解锁功能的具体代码,供大家参考,具体内容如下1.背景最近做一个小东西,需要登录
- 这篇分享几个在地址栏实现的Javascript有趣效果和应用。能在浏览器地址栏实现的效果太多了,字体放大、显示所有图片、显示Cookie等等
- python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。下面将具体介绍几种常用情况:(1)主程序
- Python encode()方法encode() 方法为字符串类型(str)提供的方法,用于将 str 类型转换成 bytes 类型,这个
- 本文实例为大家分享了Go实现文件上传的具体代码,供大家参考,具体内容如下文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进
- 前言python爬虫系列文章的第3篇介绍了网络请求库神器 Requests ,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常
- 步骤如果要使用GPU进行机器学习的训练,那么首先需要支持训练的显卡及驱动即正确安装CUDA、CUDNN,最重要的一点是需要与驱动对应的tor