面试之SQL

1. 查询性能优化:从数据库查询数据时,你必定遇到过查询很慢的状况,请问你是怎么处理的。数据库

答:安全

遇到的问题描述:是遇到过这种状况,咱们给客户作过一款软件,日志库搜集了6000万条数据,显示、查询时候慢的要命。性能优化

查询慢的缘由:一般状况下有几种状况可能致使,①硬件资源不足(不考虑);②数据量确实很大(不考虑);③并发量大,架构有问题;④数据表设计有问题;⑤查询语句存在性能问题。
服务器

可行的解决方案:架构

①:升级硬件资源,内存、存储、磁盘、CPU并发

②:数据量大分两种状况:负载均衡

  • 表中数据多,这个是正常状况(处理的就是这种状况);
  • 查询出来的结果数据量大,这种状况能够分页加载或触发式加载或者加载一部分。

③:并发量大,若是是服务器常常处于高负荷状态,那就须要增长服务器,作负载均衡;若是数据库读写都很频繁,那么能够读写分离。ide

④:表设计有问题,没有建立索引,没有建立对索引。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。建立索引是提升查询速度最有效的方式。建立索引应遵照必定的规则:性能

  • 在常常进行条件查询,可是没有指定为外键的列上创建索引,而不常常查询的字段则由优化器自动生成索引。
  • 在频繁用到排序、分组的字段上创建索引
  • 在相同值少的字段上创建索引
  • 不能建立索引过多,不然会对写数据形成影响

⑤:查询Sql语句写的有问题,这个是最多见的致使性能问题的缘由,有如下几种状况:大数据

  • 主查询或子查询中使用Select * 查询或查询过多冗余字段
  • 一个查询语句中,主查询和子查询语句中频繁使用排序或分组(Order By,Group By)
  • 语句写的不当,致使Sql放弃使用索引查询,包括:对null进行判断;使用!=或<>操做符;使用链接符or;使用in、not in;使用模糊查询like;
  • 联表查询时,有的数据被反复查询

因此我在对查询进行优化的时候,我首先从新检查表的索引是否建立的合理,而后根据以上的几点,检查查询语句是否存在可改进的地方,而后运行Profiler,进行查询跟踪优化。(尽可能快速的描述)

 

2. 什么是索引,有几种,有什么优缺点,在什么状况下使用

答:

1. 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。做用相似于目录,用于快速检索。

2. 

    惟一索引: 建立惟一约束会自动建立惟一索引。 它对应的列中仅容许有一个null值。 

     主键索引: 是惟一索引的一种特殊类型。建立主键会自动建立主键索引。 要求主键中的每一个值是非空,惟一的。 

     汇集索引: 表中各行的物理顺序与键值的逻辑顺序相同。 

     非汇集索引: 表中各行数据存放的物理顺序与键值的逻辑顺序不匹配。汇集索引比非汇集索引有更快的数据访问速度。 

     复合索引: 将多个列组合做为索引 

     全文索引: 是一种特殊类型的寄语标记的功能型索引,由SQL server 中全文引擎服务建立和维护。(不熟悉这个,没提) 

3. 

使用T-SQL语句建立 

      create  [unique] [clustered  |  nonclustered]  index  index_name 

      on  table_name  (column_name[, column_name] ...) 

      [with  fillfactor=x] 

      说明: fillfactor 表示填充因子, 指定一个1-100的值,该值指定索引页填充的空间所占的百分比。

4.  

优势:大数据下能够快速的查询检索

   缺点:索引会影响数据改删的速度

5. 

建议使用的状况:①表中数据大,小数据就不用建立了;②常常作查询选择的列;③常常排序分组的列;④常常用作链接的列(主外键);

不建议使用的状况:①数据小;②相同值很是多的列

3. 什么是存储过程,你在什么状况下用过

答:

定义:存储过程就是做为可执行对象存放在数据库中的一个或多个SQL命令,是能完成必定操做的一组SQL语句。

优势:存储过程只在创造时进行编译,之后每次执行存储过程都不需再从新编译,而通常SQL语句每执行一次就编译一次,因此使用存储过程可提升数据库执行速度;存储过程能够重复使用,可减小数据库开发人员的工做量;安全性高,可设定只有某些用户才具备对指定存储过程的使用权;修改方便,不须要改动程序;

使用场景:在定时做业里用过

 4. 什么是事务?

答:

数据库事务(Database Transaction) ,是指做为单个逻辑工做单元执行的一系列操做,要么彻底地执行,要么彻底地不执行。 事务处理能够确保除非事务性单元内的全部操做都成功完成,不然不会永久更新面向数据的资源。经过将一组相关操做组合为一个要么所有成功要么所有失败的单元,能够简化错误恢复并使应用程序更加可靠。

事务模型:隐式事务(每条SQL语句);显式事务(带有Begin End)

5. 什么是视图?

答:

视图能够看做定义在SQL Server上的虚拟表,是另外一种查看数据的入口。视图自己并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的数据。

视图分类:普通视图;索引视图;分割视图

视图优势:①视图隐藏了底层的表结构,简化了数据访问操做;②由于隐藏了底层的表结构,因此大大增强了安全性,用户只能看到视图提供的数据;③使用视图,方便了权限管理,让用户对视图有权限而不是对底层表有权限进一步增强了安全性;④视图提供了一个用户访问的接口,当底层表改变后,改变视图的语句来进行适应,使已经创建在这个视图上客户端程序不受影响

6. 什么是游标?

答:

是对查询出来的结果集做为一个单元来有效的处理。游标能够定在该单元中的特定行,从结果集的当前行检索一行或多行。能够对结果集当前行作修改。通常不使用游标,可是须要逐条处理数据的时候,游标显得十分重要。

7. 什么是触发器?

答:

触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器通常用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操做。诸如:update、insert、delete这些操做的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器能够分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

类型:DML触发器分为:1. after触发器 insert、update、delete 2. instead of触发器

8. Sql中都有哪些经常使用的对象,怎么用T-SQL建立这些对象

答:

数据库: 

 1 create database student_db 
 2 on primary -- 默认就属于primary文件组,可省略
 3 (
 4     name='student_db',
 5     filename='D:\student_db.mdf',
 6     size=5mb,
 7     maxsize=100gb,
 8     filegrowth=10%
 9 )
10 log on
11 (
12     name='student_log',
13     filename='D:\student_log.ldf',
14     size=2mb,
15     filegrowth=1mb
16 )
DataBase

表: 

 1 CREATE TABLE [dbo].[table_name](
 2     [Id] [bigint] IDENTITY(1,1) NOT NULL,
 3     [Name] [nvarchar](255) NOT NULL,
 4     [Description] [nvarchar](4000) NULL,
 5     [Time] [datetime] NOT NULL,
 6     [CardId] [nvarchar](18) NOT NULL,
 7  CONSTRAINT [PK_table_name] PRIMARY KEY CLUSTERED 
 8 (
 9     [Id] ASC
10 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
11 ) ON [PRIMARY]
12 
13 GO
14 
15 ALTER TABLE [dbo].[table_name] ADD  CONSTRAINT [DF_table_name_Time]  DEFAULT (getdate()) FOR [Time]
16 GO
17 
18 
19 新增字段:
20 ALTER TABLE [table_name] ADD [field_name] NVARCHAR (50) NULL
21 
22 
23 删除字段:
24 ALTER TABLE [table_name] DROP COLUMN [field_name]
25 
26 修改字段:
27 ALTER TABLE [table_name] ALTER COLUMN [field_name] NVARCHAR (50) NULL
28 
29 新建默认值
30 ALTER TABLE [table_name] ADD CONSTRAINT default_name DEFAULT \'0\' FOR [field_name]
Table

 存储过程:

 1 CREATE PROCEDURE PROC_INSERT_UPDATE_DATA_STUTEND
 2         @Id int, 
 3         @StudentName nvarchar(255),
 4         @StudentValue nvarchar(255)
 5     AS
 6     BEGIN
 7         DECLARE @Count int
 8         SET @Count = (SELECT COUNT(Id) FROM myDATA_Student WHERE Id= @Id)
 9 
10         IF (@COUNT>0)
11             BEGIN
12                 UPDATE myDATA_Student SET StudentValue = @StudentValue WHERE Id = @Id
13             END
14         ELSE
15             BEGIN
16                 INSERT INTO myDATA_Student (StudentName, StudentValue) VALUES (@StudentName, @StudentValue)
17              END
18     END
Procedure

视图:

1 Create View student_view as
2 Select Id, StudentName, StudentValue From Students Where Id>10
View

触发器:

 1 if (object_id('trigger_classes_insert', 'tr') is not null)
 2     drop trigger trigger_classes_insert_stu
 3 go
 4 create trigger trigger_classes_insert_stu
 5 on teacher
 6     for insert --插入触发
 7 as
 8     --定义变量
 9     declare @Id int, @Name nvarchar(255);
10     select @Id = id, @Name = name from inserted;
11     insert into students values(@Id, @Name);
12 go
13 
14 insert into teacher(Id, Name) values('2', '荷花');
15 select Id, Name from teacher;
16 select Id, Name from students order by Id;
Trigger

 索引:

1 CREATE NONCLUSTERED INDEX IX_table_name_field_name --建立一个非汇集索引
2 ON Student(Name)
3 WITH FILLFACTOR = 60
4 GO
Index
相关文章
相关标签/搜索