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

答:

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

查询慢的原因:通常情况下有几种情况可能导致,①硬件资源不足(不考虑);②数据量确实很大(不考虑);③并发量大,架构有问题;④数据表设计有问题;⑤查询语句存在性能问题。

可行的解决方案:

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

②:数据量大分两种情况:

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

③:并发量大,如果是服务器经常处于高负荷状态,那就需要增加服务器,做负载均衡;如果数据库读写都很频繁,那么可以读写分离。

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

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

⑤:查询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创建这些对象

答:

数据库:

 create database student_db
on primary -- 默认就属于primary文件组,可省略
(
name='student_db',
filename='D:\student_db.mdf',
size=5mb,
maxsize=100gb,
filegrowth=10%
)
log on
(
name='student_log',
filename='D:\student_log.ldf',
size=2mb,
filegrowth=1mb
)

DataBase

表:

 CREATE TABLE [dbo].[table_name](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](255) NOT NULL,
[Description] [nvarchar](4000) NULL,
[Time] [datetime] NOT NULL,
[CardId] [nvarchar](18) NOT NULL,
CONSTRAINT [PK_table_name] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO ALTER TABLE [dbo].[table_name] ADD CONSTRAINT [DF_table_name_Time] DEFAULT (getdate()) FOR [Time]
GO 新增字段:
ALTER TABLE [table_name] ADD [field_name] NVARCHAR (50) NULL 删除字段:
ALTER TABLE [table_name] DROP COLUMN [field_name] 修改字段:
ALTER TABLE [table_name] ALTER COLUMN [field_name] NVARCHAR (50) NULL 新建默认值
ALTER TABLE [table_name] ADD CONSTRAINT default_name DEFAULT \'0\' FOR [field_name]

Table

存储过程:

 CREATE PROCEDURE PROC_INSERT_UPDATE_DATA_STUTEND
@Id int,
@StudentName nvarchar(255),
@StudentValue nvarchar(255)
AS
BEGIN
DECLARE @Count int
SET @Count = (SELECT COUNT(Id) FROM myDATA_Student WHERE Id= @Id) IF (@COUNT>0)
BEGIN
UPDATE myDATA_Student SET StudentValue = @StudentValue WHERE Id = @Id
END
ELSE
BEGIN
INSERT INTO myDATA_Student (StudentName, StudentValue) VALUES (@StudentName, @StudentValue)
END
END

Procedure

视图:

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

View

触发器:

 if (object_id('trigger_classes_insert', 'tr') is not null)
drop trigger trigger_classes_insert_stu
go
create trigger trigger_classes_insert_stu
on teacher
for insert --插入触发
as
--定义变量
declare @Id int, @Name nvarchar(255);
select @Id = id, @Name = name from inserted;
insert into students values(@Id, @Name);
go insert into teacher(Id, Name) values('', '荷花');
select Id, Name from teacher;
select Id, Name from students order by Id;

Trigger

索引:

 CREATE NONCLUSTERED INDEX IX_table_name_field_name --创建一个非聚集索引
ON Student(Name)
WITH FILLFACTOR = 60
GO

Index

面试之SQL的更多相关文章

  1. 关于面试总结-SQL经典面试题

    关于面试总结6-SQL经典面试题 前言 用一条SQL 语句查询xuesheng表每门课都大于80 分的学生姓名,这个是面试考sql的一个非常经典的面试题 having和not in 查询 xueshe ...

  2. 关于面试总结-SQL学生表

    前言 每次面试必考SQL,小编这几年一直吃SQ的亏,考题无非就是万年不变学生表,看起来虽然简单,真正写出来,还是有一定难度.于是决定重新整理下关于SQL的面试题,也可以帮助更多的人过SQL这一关. 作 ...

  3. 决胜面试之---SQL经典面试题

    在SQL面试部分,一般会考核多表连接查询能力,精选了一些SQL面试题记录下: 四张表(学生表,教师表,课程表,成绩表)                       以下是表的创建和添加SQL语句 学生 ...

  4. 面试之SQL(2)--left join, inner join 和 right join的区别

    表A记录如下: aID        aName 1           a1 2           a2 3           a3 4           a4 5           a5 ...

  5. 面试1 SQL SERVER 查询第20行到30之间的数据

    SQL SERVER 查询第20行到30之间的数据 1.先查询前20行的ID,后查询除去20条记录的前10条记录 SELECT TOP 10 * FROM tbBank WHERE BankID NO ...

  6. android面试(5)---SQL数据库

    SQL基础: 1.如何查询table1从20到30条记录: select * from table1 limit 19,11 2.替换id=1,name =deman的记录? replace into ...

  7. 面试问题 - SQL 中存储过程与函数的区别

    SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行.  但函数也有着更多的限制,比如不能使用临 ...

  8. 面试之SQL(1)--选出选课数量>=2的学号

    ID      Course 1 AA 1 BB 2 AA 2 BB 2 CC 3 AA 3 BB 3 CC 3 DD 4 AA NULL NULL 选出选课数量>=2的学号 selectdis ...

  9. 面试:sql语句-1-基础查询

    1.基础查询

随机推荐

  1. [原]AngularJS iframe打开不同域的内容时报错误

    <iframe id="myFrame" ng-src="{{url}}" width="100%" height="100 ...

  2. 问题:关于坛友一个获取text内容并改变样式的实现

    需求:点击button获得input框中选中的内容,让选中的内容变红, 实现:代码如下 1: <!DOCTYPE HTML> 3: <head> "content-t ...

  3. python join和split和strip用法

    python join 和 split方法的使用,join用来连接字符串,split恰好相反,拆分字符串的. strip()为去除开头结尾指定的字符,空着时是去除空白字符\t,\n,\r意思 1.jo ...

  4. 洛谷 P2279 03湖南 消防局的设立

    2016-05-30 16:18:17 题目链接: 洛谷 P2279 03湖南 消防局的设立 题目大意: 给定一棵树,选定一个节点的集合,使得所有点都与集合中的点的距离在2以内 解法1: 贪心 首先D ...

  5. BNUOJ-26586 Simon the Spider 最小生成树+枚举

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26586 题意:给一个图,每条边有一个权值.要你求选择一棵树,权值和为sum,然后在树上选择 ...

  6. rabbitMQ 笔记

    1. 端口 rabbitMQ  server 使用的端口是5672  ,   AMQP协议的端口 rabbitMQ  web 使用的端口是15672  ,   管理工具的端口 rabbitMQ  cl ...

  7. POJ 3648-Wedding(2-SAT)

    题面很邪恶啊... 一对新人请n-1对夫妻吃饭,人们坐在一张桌子的两侧,每一对互为夫妻关系的人必须坐在桌子的两侧.而且有些人两两之间会存在“通奸”关系,通奸关系不仅在男女之间,同性之间也有.新娘对面不 ...

  8. 高效使用Bitmaps(二) 后台加载Bitmap

    转载:http://my.oschina.net/rengwuxian/blog/183802 为什么要在后台加载Bitmap? 有没有过这种体验:你在Android手机上打开了一个带有含图片的Lis ...

  9. Android 添加、移除和判断 桌面快捷方式图标

    思路: Launcher为了应用程序能够定制自己的快捷图标,就注册了一个 BroadcastReceiver 专门接收其他应用程序发来的快捷图标定制信息.所以只需要根据该 BroadcastRecei ...

  10. 多年的.NET开发,也只学会了这么几招

    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了   随着工作年龄逐渐增加,身边的重担也越来越多.以前可以在公司加班到晚上10点,现在不行了.以前可以通宵 ...