面試之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
相關文章
相關標籤/搜索