1. 查詢性能優化:從數據庫查詢數據時,你必定遇到過查詢很慢的狀況,請問你是怎麼處理的。數據庫
答:安全
遇到的問題描述:是遇到過這種狀況,咱們給客戶作過一款軟件,日誌庫蒐集了6000萬條數據,顯示、查詢時候慢的要命。性能優化
查詢慢的緣由:一般狀況下有幾種狀況可能致使,①硬件資源不足(不考慮);②數據量確實很大(不考慮);③併發量大,架構有問題;④數據表設計有問題;⑤查詢語句存在性能問題。
服務器
可行的解決方案:架構
①:升級硬件資源,內存、存儲、磁盤、CPU併發
②:數據量大分兩種狀況:負載均衡
③:併發量大,若是是服務器常常處於高負荷狀態,那就須要增長服務器,作負載均衡;若是數據庫讀寫都很頻繁,那麼能夠讀寫分離。ide
④:表設計有問題,沒有建立索引,沒有建立對索引。索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。建立索引是提升查詢速度最有效的方式。建立索引應遵照必定的規則:性能
⑤:查詢Sql語句寫的有問題,這個是最多見的致使性能問題的緣由,有如下幾種狀況:大數據
因此我在對查詢進行優化的時候,我首先從新檢查表的索引是否建立的合理,而後根據以上的幾點,檢查查詢語句是否存在可改進的地方,而後運行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 )
表:
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]
存儲過程:
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
視圖:
1 Create View student_view as 2 Select Id, StudentName, StudentValue From Students Where Id>10
觸發器:
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;
索引:
1 CREATE NONCLUSTERED INDEX IX_table_name_field_name --建立一個非彙集索引 2 ON Student(Name) 3 WITH FILLFACTOR = 60 4 GO