excel是一个自由表,一个EXCEL的工作薄就是一个数据库,它里面的每一张表就是数据库的表,你可象 *** 作表一样对其进行查询等 *** 作,它里面的列就是数据库的字段,行就是记录,因此你可以按数据库的架构来组建数据,只是你如果你组建的数据不符合数据库的规则,在查询时不能得到时相应的结果。因此在EXCEL中不存在创建数据库。但对存在的数据可以引用。当满足条件A、B、C、D……时引用是可以的,但如果是在EXCEL中直接引用是不行的,一种是用VBA利用ADO访问EXCEL,在查询时把A、B、C、D几个条件按SQL语法写进查询语句中,引用返回的记录集,一种是利用函数把满足A、B、C、D的记录筛选出来,然后再引用。
怎么在SQL数据库中新建表。
可以有两种办法啦:
1.在企业管理器里面建:这种方法很简单点击选中的数据库右键新建即可相信你应该会不多说了。
2.在查询分析器里建:基本思路要建表,表是要在库里建的所以你要先引用你要使用的数据库加进来再开始建表,以下为一个简单实例;
create database student --创建一个student数据库由于这里主要说建表所以建一个简单的数据库
use student --引用数据库student
create table Test( --创建一个Test表
name varchar(20) primary key indentity(1,1),--列名(字段名) 数据类型 在此加主键约束就不用加非空约束 再加上自动增长列(含义从1开始增长增长量是1)
password varchar(10) not null --注意建表最后一个字段名时结尾不要加逗号否则会出错
)
sqlserver 下怎么建立数据库 怎么建表
方法/步骤
1
首先我们打开SQL SERVER自带的数据库管理工具,从开始菜单中可以找到,如图点击进去;
2
开始连接SQL SERVER服务器,就是我们装好的SQL SERVER 服务器;
3
右击数据库,选择第一个,新建一个数据库;
4
填写数据库的名称,下面是设置自动增长的,一般不用管,默认
5
点击确定后就可以生成一个数据库,此时里面是没有表的;
6
右击表新建一个表,填写你要的字段名称
7
填完字段名称后点击字段名称那个内部窗口的小叉叉,然后就提示你输入表名了,填写下表名,一个数据库的建立过程就是这样的;
或者
create database stuDB
on primary -- 默认就属于primary文件组,可省略
(
/*--数据文件的具体描述--*/
name='stuDB_data', -- 主数据文件的逻辑名称
filename='D:\stuDB_data.mdf', -- 主数据文件的物理名称
size=5mb, --主数据文件的初始大小
maxsize=100mb, -- 主数据文件增长的最大值
filegrowth=15%--主数据文件的增长率
)
log on
(
/*--日志文件的具体描述,各参数含义同上--*/
name='stuDB_log',
filename='D:\stuDB_log.ldf',
size=2mb,
filegrowth=1mb
)
怎样建立一个简单数据库?
把excel导入数据库,不出现表格嵌套可以使用下面这个方法导入;
思路:
(1)、把excel数据读入到dataset中;
(2)、建立相应结构的数据表格
(3)、把dat畅set中的数据更新到数据表中
如何在数据库中建立表
Create table 表名字
(表栏名1 数据类型,
表栏名2 数据类型,
表栏名3 数据类型,
表栏名4 数据类型);
例如:
Create table 上课表
(学生 Varchar(10),
学号 Number(10))
如何建立一个新的ACCESS表格
新建一个数据库有两种方法:一种是创建一个空数据库,即建立一个没有表、查询、窗体和报表等内容的数据库;另一种方法是使用Access中提供的数据库模板创建数据库,即通过对向导所提出的选项和不同选择来设计窗体、查询和报表等,从而建立一个完整的数据库。这里我们将使用第一种方法:
Step1:在Access窗口中单击 “文件(F)”菜单,在下拉菜单中选择 “新建”项,将得到对话框。
“新建”对话框
双击 “数据库” 图标,即会显示 “文件新建数据库” 对话框,
Step3:在文件名文本框中输入要保存数据库的文件夹及新建的数据库名,如 “C:\test”,然后选择 “确定”。即可创建好一个名为 “test” 的数据库。
二.添加数据表
表是Access数据库的基础,是信息的载体。其它对象如查询、窗体和报表,也是将表中的信息以各种形式表现出来,方便用户使用这些信息。在Access中,创建表的方法有三种:一是使用设计器创建表;二是通过输入数据创建表;三是利用向导创建表。在这里,我们采用第一种方法创建表:
Step4:在窗体中,双击 “使用设计器创建表”,则会出现对话框。
表设计器对话框
Step5:在“字段名称”列的第一行中输入authors表的第一个字段的名字 id。然后按回车键,此时在“数据类型”列中会显示出一个按钮,单击按钮,在d出的下拉列表中选择“文本”选项,设置 id 字段的类型为文本型。
设置字段数据类型
Step6:在“字段属性饥域的“常规”选项卡中,可以设置字段的大小、格式和规则等。如我们可以把id字段的长度大小设置为12,并且规定其不能为空,因此,可以设置如下:在 “字段大小”文本框中输入12,在 “必填字段”文本框中输入“是”,在“允许空字符串”文本框中输入“否”。
设置字段属性内容
Step7:重复上述方法,添加其它字段,并设置其属性。
Step8:设置完成后,单击 “文件(F)”菜单,在下拉菜单中选择 “保存”项,将会出现一个如图1.8的对话框,在“表名称”文本框中输入表名 authors,单击确定按钮。
“保存”对话框
Step9:此时,系统会提示用户建立一关键字段。一般情况下单击“是”完成即可。
如何用mysql创建创建博客数据库表
1.创建一个数据库为test_db
mysql>create database test_db
Query OK, 1 row affected (0.00 sec)
切换到test_db上
mysql>use test_db
Database changed
mysql>
2.创建一个表tb_emp1
create table tb_emp1
(
id INT(11),
name VARCHAR(25),
deptid INT (11),
salary FLOAT
)
mysql>create table tb_emp1
->(
->id INT(11),
->name VARCHAR(25),
->deptid INT (11),
->salary FLOAT
->)
Query OK, 0 rows affected (0.09 sec)
MYsql数据库怎样创建表? 20分
CREATE DATABASE cookbook创建一个叫“cookbook”的数据库
USE cookbook使用cookbook这个数据库
CREATE TABLE limbs (thing VARCHAR(抚0),legs INT,arms INT)创建表“limbs”其中包括thing,legs,aems 字段
创建表的命令是 CREATE TABLE 表名称
后面括号里的内容是表中字段的属性
如何 SQL创建表
商品表
create table product
(
proid varchar(20) primary key,
proname varchar(50),
proprice money,
procount int
)
顾客表
create table customer
(
custno varchar(20) primary key,
custname varchar(50),
custsex varchar(10),
custage int,
custtel varchar(20)
)
订单表
create table orderitem
(
custno varchar(20),
proid varchar(20),
ocount int,
oprice money,
odate date
)
外键
alter table orderitem add constraint fk_custno foreign key(custno) references customer(custno)
alter table orderitem add constraint fk_proid foreign key(proid) references product(proid)
SQL数据库怎么创建表.
CREATE TABLE [dbo].[student]( [学号] [CHAR](8) NOT NULL, [姓名] [CHAR](8) NULL, [性别] [CHAR](2) NULL, [年龄] [INT] NULL, [联系方式] [CHAR](11) NULL, [所在院系] [CHAR](20) NULL, CONSTRAINT [PK_student] PRIMARY KEY CLUSTERED ( [学号] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NOREPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_PADDING OFFGOALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK_student] CHECK (([性别]='女' OR [性别]='男'))GOALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK_student]GOALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK_student_1] CHECK (([联系方式] LIKE '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))GOALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK_student_1]GOALTER TABLE [dbo].[student] ADD CONSTRAINT [DF_student_所在院系] DEFAULT ('电信系') FOR [所在院系]GO
创建目录
mkdir d:\oracle\product\ \database
mkdir e:\oracle\admin\Ora g\bdump
mkdir e:\oracle\admin\Ora g\cdump
mkdir e:\oracle\admin\Ora g\create
mkdir e:\oracle\admin\Ora g\pfile
mkdir e:\oracle\admin\Ora g\udump
mkdir e:\oracle\flash_recovery_area
mkdir e:\oracle\oradata
mkdir e:\oracle\oradata\Ora g
生成windows服务 创建密码文件 在cmd命令下运行
set ORACLE_SID=dbca 绿色部分设置oracle 实例名为 为ora g
d:\oracle\product\ \DB_ \bin\oradim exe new sid ORA G startmode manual spfile d:\oracle\product\ \DB_ \bin\oradim exe edit sid ORA G startmode a spfile
创建一个实例名为dbca 并且有手动启动方式改为自动启动
d:\oracle\product\ \DB_ \bin\orapwd exe file=d:\oracle\product\ \db_ \PWDOra g ora password=sysPassword force=y
用oracle自带的orapwd 为sys用户创建一个默认的密码为sysPassword
执行创建数据库脚本
D:\oracle\ora \bin\sqlplus /nolog @D:\oracle\admin\dbca\scripts\CreateDB sql
D:\oracle\ora \bin\sqlplus /nolog @D:\oracle\admin\dbca\scripts\CreateDBFiles sql
D:\oracle\ora \bin\sqlplus /nolog @D:\oracle\admin\dbca\scripts\CreateDBCatalog sql
D:\oracle\ora \bin\sqlplus /nolog @D:\oracle\admin\dbca\scripts\postDBCreation sql
黑体部分就是创建数据库要调用的脚本
第一 CreateDB sql
connect SYS/change_on_install as SYSDBA 这是刚刚我们设置的密码以sysdba身份连接到数据库
connect SYS/change_on_install as SYSDBA 这是刚刚我们设置的密码以sysdba身份连接到数据库
set echo on
spool D:\oracle\ora \assistants\dbca\logs\CreateDB log 写日志
startup nomount pfile= D:\oracle\admin\dbca\scripts\init ora 调用参数文件 启动数据库到只装载实例阶段
CREATE DATABASE dbca
MAXINSTANCES
MAXLOGHISTORY
MAXLOGFILES
MAXLOGMEMBERS
MAXDATAFILES 控制文件记录的相关最大日志数 日志组 最大数据文件数等限制
DATAFILE D:\oracle\oradata\dbca\system dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE D:\oracle\oradata\dbca\temp dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED
UNDO TABLESPACE UNDOTBS DATAFILE D:\oracle\oradata\dbca\undotbs dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED 创建系统 临时 回滚 表空间ITPUB个人空间!dJ l {!i W r f
CHARACTER SET ZHS GBK
NATIONAL CHARACTER SET AL UTF 字符集
LOGFILE GROUP ( D:\oracle\oradata\dbca\redo log ) SIZE K
GROUP ( D:\oracle\oradata\dbca\redo log ) SIZE K
GROUP ( D:\oracle\oradata\dbca\redo log ) SIZE K创建日志文件租和成员
spool off
exit
第二 CreateDBFiles sql
connect SYS/change_on_install as SYSDBA
set echo on
spool D:\oracle\ora \assistants\dbca\logs\CreateDBFiles log
CREATE TABLESPACE INDX LOGGING DATAFILE D:\oracle\oradata\dbca\indx dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
CREATE TABLESPACE TOOLS LOGGING DATAFILE D:\oracle\oradata\dbca\tools dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
CREATE TABLESPACE USERS LOGGING DATAFILE D:\oracle\oradata\dbca\users dbf SIZE M REUSE AUTOEXTEND ON NEXT K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO 创建相关用户要用到的表空间
spool off
第三:CreateDBCatalog sql
创建system数据字典 存放到system表空间 相关表 视图等
connect SYS/change_on_install as SYSDBA
set echo on
spool D:\oracle\ora \assistants\dbca\logs\CreateDBCatalog log
@D:\oracle\ora \rdbms\admin\catalog sql
@D:\oracle\ora \rdbms\admin\catexp sql
@D:\oracle\ora \rdbms\admin\catblock sql
@D:\oracle\ora \rdbms\admin\catproc sql
@D:\oracle\ora \rdbms\admin\catoctk sql
@D:\oracle\ora \rdbms\admin\owminst plb
connect SYSTEM/manager
@D:\oracle\ora \sqlplus\admin\pupbld sql
connect SYSTEM/manager
set echo on
spool D:\oracle\ora \assistants\dbca\logs\sqlPlusHelp log
@D:\oracle\ora \sqlplus\admin\help\hlpbld sql helpus sql
spool off
spool off
exit
第四: postDBCreation sql
connect SYS/change_on_install as SYSDBA
set echo on
spool D:\oracle\ora \assistants\dbca\logs\postDBCreation log
@D:\oracle\ora \rdbms\admin\utlrp sql编译相关视图 包对象等
shutdown 关闭数据库
connect SYS/change_on_install as SYSDBA
set echo on
spool D:\oracle\ora \assistants\dbca\logs\postDBCreation log
create spfile= D:\oracle\ora \database\spfiledbca ora FROM pfile= D:\oracle\admin\dbca\scripts\init ora
创建服务器参数文件代替文件初始化参数文件 方便有时在不重启数据库的情况下可以使参数生效
从上面可以看到spfile文件的存放位置
startup 启动数据库 创建数据库完成 从上面可以看出 创建数据库有以下 个步骤
Step : 创建相关trace目录文件夹
Step :创建实例 密码 启动方式
Step :创建初始化参数文件 init ora
Step : 连接到实例
Step : 启动实例到nomount状态
Step :创建数据库
Step :创建表空间
Step : 运行脚本创建数据字典
Step : 创建服务器参数文件(这步不是必须的 但oracle建议做这步) 好处会在以后的总结中列出
下面也贴出linux下脚本 和windows下几乎差不多
#!/bin/sh
mkdir /oradata/ora i
mkdir /oradata/ora i/controlfile
mkdir /oradata/ora i/redofile
mkdir /orasys/oracle/admin
mkdir /orasys/oracle/admin/ora i
mkdir /orasys/oracle/admin/ora i/bdump
mkdir /orasys/oracle/admin/ora i/cdump
mkdir /orasys/oracle/admin/ora i/create
mkdir /orasys/oracle/admin/ora i/udump
mkdir /orasys/oracle/admin/ora i/pfile
cp init ora /orasys/oracle/product/ /dbs/
export ORACLE_BASE=/orasys/oracle
export ORACLE_HOME=$ORACLE_BASE/product/
export ORACLE_SID=ora i
export ORA_NLS =$ORACLE_HOME/omon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
echo Add this entry in the oratab: ora i:/orasys/oracle/product/ :Y
/orasys/oracle/product/ /bin/orapwd file=/orasys/oracle/product/ /dbs/orapwora i password=change_on_install
/orasys/oracle/product/ /bin/sqlplus /nolog @/home/oracle/create_script/CreateDB sql
/orasys/oracle/product/ /bin/sqlplus /nolog @/home/oracle/create_script/CreateDBFiles sql
/orasys/oracle/product/ /bin/sqlplus /nolog @/home/oracle/create_script/CreateDBCatalog sql
lishixinzhi/Article/program/Oracle/201311/17648数据库实验总结【一】
试验内容
1、 数据表的建立
基本表《简单的》带有主键
带有外码约束的(外码来自其他表或者本表)
2、 数据表的修改
添加删除列
修改列属性类型
添加删除约束(约束名)
元组的添加,修改,删除
删除数据表
试验过程
1、create table student
(
sno char(9) primary key , /*sno是主码 列级完整性约束条件*/
sname char(20) unique, /*sname取唯一值*/
ssex char(2),
sage smallint, /*类型为smallint*/
sdept char(20) /*所在系*/
)
create table course
(
cno char(4) primary key, /*列级完整性约束条件,cno是主码*/
cname char(40),
cpno char(4), /*cpno的含义是先行课*/
ccredit smallint,
foreign key (cpno) references course(cno)
/*表级完整性约束条件,cpno是外码,被参照表是course,被参照列是cno*/
)
create table sc
(
sno char(9),
cno char(4),
grade smallint,
primary key (sno,cno),
/*主码有两个属性构成,必须作为表级完整性进行定义*/
foreign key (sno) references student(sno),
/*表级完整性约束条件,sno是外码,被参照表是student*/
foreign key (cno) references course(cno),
/*表级完整性约束条件,cno是外码,被参照表示course*/
)
例1、create table s
(
cno varchar(3), /*变长的字符串,输入2个字符就是两个字符不会补空格*/
sname varchar(20),
status int,
city varchar(20),
constraint pk_sno primary key(sno), /*约束条件的名字为pk_sno*/
)
create table p
(
pno varchar(3),
pname varchar(20),
color varchar(3),
weight int,
constraint pk_pno primary key (pno), /*约束条件的名字是pk_pno*/
)
create table j
(
jno varchar(3),
jname varchar(20),
city varchar(20),
constraint pk_jno primary key(jno) /*约束条件的名字为pk_jno*/
)
例2、create table spj
(
sno varchar(3), /*第一个表中的主码*/
pno varchar(3),
jno varchar(3),
qty int, /*数量*/
constraint pk_spj primary key(sno,pno,jno), /*主码由3个属性组成*/
foreign key(sno) references s(sno),
/*表级完整性约束条件,sno是外码,被参照表是s*/
foreign key(pno) references p(pno),
/*表级完整性约束条件,pno是外码,被参照表是p*/
foreign key(jno) references j(jno),
/*表级完整性约束条件,jno是外码,被参照表是j*/
)
2、数据表的更改
在s表中添加一个concat 列
alter table s add concat varchar(20)
在s表中删除concat 列
alter table s drop column concat
更改s表 concat列的属性 把长度由20改为30
alter table s alter column concat varchar(30)
联系方式 名字为concat 修改属性为唯一的 属性名为con_concat
alter table s add constraint con_concat unique(concat)
删除约束关系con_concat
alter table s drop constraint con_concat
/*插入一个元组*/
insert into s valus(‘s1’,’精益’,20,’天津’) /*20不能写成’20’*/
试验中的问题的排除与总结:
1、在创建spj时
有三个实体所以从3个实体中取主码,还有一个数量属性也要写上
主码由那3个主码确定
2、更改一个数据库中数据表时一定要先使该数据库处于正在使用状态
3、constraint
是可选关键字,表示 primary key、not null、unique、foreign key 或 check 约束定义的开始。约束是特殊属性,用于强制数据完整性并可以为表及其列创建索引。
4、--go可以不加但是要注意顺序 注:go --注释 提示错误
5、注意添加一个空元素用 null
附 sql备份
--创建一个数据库 student
create database student
go
--在数据库student中创建表student course sc 注意顺序
use student
----------------------------------------------------------------
create table student
(
sno char(9) primary key, /*sno是主码 列级完整性约束条件*/
sname char(10) unique, /*sname取唯一值*/
ssex char(2),
sage smallint, /*类型为smallint*/
sdept char(20) /*所在系*/
)/*要加*/
-----------
数据库实验总结【二】我在sql server 索引基础知识系列中,第一篇就讲了记录数据的基本格式。那里主要讲解的是,数据库的最小读存单元:数据页。一个数据页是8k大小。
对于数据库来说,它不会每次有一个数据页变化后,就存到硬盘。而是变化达到一定数量级后才会作这个 *** 作。 这时候,数据库并不是以数据页来作为 *** 作单元,而是以64k的数据(8个数据页,一个区)作为 *** 作单元。
区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 kb)。这意味着 sql server 数据库中每 mb 有 16 个区。
为了使空间分配更有效,sql server 不会将所有区分配给包含少量数据的表。sql server 有两种类型的区:
统一区,由单个对象所有。区中的所有 8 页只能由所属对象使用。
混合区,最多可由八个对象共享。区中八页的每页可由不同的对象所有。
通常从混合区向新表或索引分配页。当表或索引增长到 8 页时,将变成使用统一区进行后续分配。如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。
为何会这样呢?
其实很简单:
读或写 8kb 的时间与读或写 64 kb的时间几乎相同。
在 8 kb 到 64 kb 范围之内,单个磁盘 i/o 传输 *** 作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。
因此,从数学上来讲,当需要传输 64 kb 以上的 sql 数据时,
尽可能地执行 64 kb 磁盘传输是有益的,即分成数个64k的 *** 作。
因为 64 kb 传输基本上与 8 kb 传输一样快,而每次传输的 sql server 数据是 8 kb 传输的 8 倍。
我们通过一个实例来看 有and *** 作符时候的最常见的一种情况。我们有下面一个表,
create table [dbo].[member]( [member_no] [dbo].[numeric_id] identity(1,1) not null, [lastname] [dbo].[shortstring] not null, [firstname] [dbo].[shortstring] not null, [middleinitial] [dbo].[letter] null, [street] [dbo].[shortstring] not null, [city] [dbo].[shortstring] not null, [state_prov] [dbo].[statecode] not null, [country] [dbo].[countrycode] not null, [mail_code] [dbo].[mailcode] not null, [phone_no] [dbo].[phonenumber] null, [photograph] [image] null, [issue_dt] [datetime] not null default (getdate()), [expr_dt] [datetime] not null default (dateadd(year,1,getdate())), [region_no] [dbo].[numeric_id] not null, [corp_no] [dbo].[numeric_id] null, [prev_balance] [money] null default (0), [curr_balance] [money] null default (0), [member_code] [dbo].[status_code] not null default (' '))
这个表具备下面的四个索引:
索引名 细节 索引的列
member_corporation_link nonclustered located on primary corp_no
member_ident clustered, unique, primary key located on primary member_no
member_region_link nonclustered located on primary region_no
memberfirstname nonclustered located on primary firstname
当我们执行下面的sql查询时候,
select m.member_no, m.firstname, m.region_nofrom dbo.member as mwhere m.firstname like 'k%' and m.region_no >6 and m.member_no <5000go
sql server 会根据索引方式,优化成下面方式来执行。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as m where m.firstname like 'k%' and m.member_no <5000) a , -- 这个查询可以直接使用 memberfirstname 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 3 次
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no >6) b
-- 这个查询可以直接使用 member_region_link 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 10 次
where a.member_no = b.member_no
不信,你可以看这两个sql 的执行计划,以及逻辑读信息,都是一样的。
其实上面的sql,如果优化成下面的方式,实际的逻辑读消耗也是一样的。为何sql server 不会优化成下面的方式。是因为 and *** 作符优化的另外一个原则。
1/26 的数据和 1/6 的数据找交集的速度要比 1/52 的数据和 1/3 的数据找交集速度要慢。
select a.member_no,a.firstname,b.region_nofrom(select m.member_no, m.firstname from dbo.member as mwhere m.firstname like 'k%' -- 1/26 数据) a,
(select m.member_no, m.region_no from dbo.member as mwhere m.region_no >6 and m.member_no <5000-- 1/3 * 1/ 2 数据) bwhere a.member_no = b.member_no
当然,我们要学习sql 如何优化的话,就会用到查询语句中的一个功能,指定查询使用哪个索引来进行。
比如下面的查询语句
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (0))where m.firstname like 'k%' and m.region_no >6 and m.member_no <5000go
select m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (1))where m.firstname like 'k%' and m.region_no >6 and m.member_no <5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (membercovering3))where m.firstname like 'k%' and m.region_no >6 and m.member_no <5000goselect m.member_no, m.firstname, m.region_nofrom dbo.member as m with (index (memberfirstname, member_region_link))where m.firstname like 'k%' and m.region_no >6 and m.member_no <5000go
这里 index 计算符可以是 0 ,1, 指定的一个或者多个索引名字。对于 0 ,1 的意义如下:
如果存在聚集索引,则 index(0) 强制执行聚集索引扫描,index(1) 强制执行聚集索引扫描或查找(使用性能最高的一种)。
如果不存在聚集索引,则 index(0) 强制执行表扫描,index(1) 被解释为错误。
总结知识点:
简单来说,我们可以这么理解:sql server 对于每一条查询语句。会根据实际索引情况(sysindexes 系统表中存储这些信息),分析每种组合可能的成本。然后选择它认为成本最小的一种。作为它实际执行的计划。
成本代价计算的一个主要组成部分是逻辑i/o的数量,特别是对于单表的查询。
and *** 作要满足所有条件,这样,经常会要求对几个数据集作交集。数据集越小,数据集的交集计算越节省成本。
的项目中,竟然出现了滥用聚集索引的问题。看来没有培训最最基础的索引的意义,代价,使用场景,是一个非常大的失误。这篇博客就是从这个角度来罗列索引的基础知识。
使用索引的意义
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
使用索引的代价
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新 *** 作时,索引需要被重建,这样降低了数据的维护速度。
创建索引的列
主键
外键或在表联接 *** 作中经常用到的列
在经常查询的字段上最好建立索引
不创建索引的列
很少在查询中被引用
包含较少的惟一值
定义为 text、ntext 或者 image 数据类型的列
heaps是staging data的很好选择,当它没有任何index时
excellent for high performance data loading (parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面几篇博客中分别提到过,下面只是一个简单的大纲,细节请参看前面几篇博客。
何时创建聚集索引?
clustered index会提高大多数table的性能,尤其是当它满足以下条件时:
独特, 狭窄, 静止: 最重要的条件
持续增长的,最好是只向上增加。例如:
identity
date, identity
guid (only when using newsequentialid() function)
聚集索引唯一性(独特型的问题)
由于聚集索引的b+树结构的叶子节点必须指向具体数据。如果你要建立聚集索引的列不唯一,并且你指定的创建的聚集索引是非唯一的聚集索引,则会有以下情况:
如果未使用 unique 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)