LocalDB 連線
LocalDB 其實是 SQL Server Express 產品的一部份,如果你要安裝最新版的 SQL Server LocalDB,那就要下載 SQL Server Express 的安裝檔。LocalDB 的安裝檔 SqlLocalDB.msi 必須從 SQL Server Express 的安裝檔來下載,執行後選擇[下載媒體],然後再選擇 LocalDB 的選項,這樣就能下載到對應版本的 LocalDB 安裝檔。
參考資料:如何下載與升級 SQL Server Express LocalDB 到最新版
SQL Server 2012 Express LocalDB 的連線伺服器名稱:(localdb)\v11.0
SQL Server 2014 Express LocalDB 的連線伺服器名稱:(localdb)\MSSQLLocalDB
官方 SQL Server 2014 Express LocalDB 文件,SQL Server 2014 Express LocalDB 預設執行個體名稱改為 MSSQLLocalDB
參考資料:升級舊專案中 SQLLOCALDB V11.0 至 V12.0
SQL 執行順序

清除資料庫交易紀錄 Log
1 | --- 清除SQL Server Log檔 |
大量資料批次刪除
REF: Break large delete operations into chunks
如果使用 DELETE 指令刪除大量資料時,可能會因為執行時間過長,造成其他也需要該資料表的功能被卡住,而發生 Timeout 的問題,因此可使用下列語法批次刪除特定數量的資料,讓刪除大量資料的動作可以分成一段一段,讓資料庫的交易可以切換。
1 | SET NOCOUNT ON; |
使用 EXISTS 取代 IN
SQL 的 IN 非常方便好用,而且可讀性也很好,但是會成為效能優化的瓶頸,因此建議使用 EXISTS 取代,除非 IN 的參數是純數值的清單。
以下兩種查詢結果是一樣的,但使用 EXISTS 的速度較快。
IN 方式查詢
使用 IN 會讓資料庫先執行 SELECT id FROM TableB 子查詢,然後將結果存在暫存表中,接著再全表掃描然後掃描暫存表取得符合條件的資料,全表掃描通長是非常耗費資源的。
1 | SELECT * FROM TableA |
EXISTS 方式查詢
使用 EXISTS 時,只要查到一筆資料滿足條件,就會終止查詢動作,而且不會產生暫存表。而且如果設定條件式中有索引(例如 id),那麼查詢 TableB 時就可以直接查詢索引即可。
1 | SELECT * FROM TableA A |
設定 In-Memory 資料表
計算最佳 Bucket count 語法
1 | SELECT |
REF:
基本指令
1 | UPDATE [TableName] SET [Column1] = 'Value1', [Column2] = 'Value2' WHERE [Condition] |
隨機挑選資料
使用 SQL 語法的 TOP n 來指定取得筆數,再用 ORDER BY 的方式,來取得 NEWID() 產生的亂數資料,並排序。
1 | SELECT TOP 1 * FROM [TableName] WHERE [Condition] ORDER BY NEWID() |
查詢筆數重複的資料
依 stud_no 欄位查詢 stud_no 欄位資料重複的筆數
1 | SELECT stud_no, COUNT(*) AS count |
查詢時顯示群組資料中最新一筆的資料(需要一個不重複的 Identity 欄位)
依 Date 欄位做判斷,顯示最新的紀錄
1 | SELECT ID, Number, Price, Date |
資料庫定序
SQL Server 的預設定序
- 台灣地區
Chinese_Taiwan_Stroke_CI_AS - 美國地區
SQL_Latin1_General_CP1_CI_AS
縮寫
- Case Sensitivity CI 指定不區分大小寫,CS 指定區分大小寫
- Accent Sensitivity AI 指定不區分腔調字,AS 指定區分腔調字(通常用在歐洲語系,如法文)
- Kana Sensitivity KS 指定區分假名(用在日文)
- Width Sensitivity WS 指定區分全半形,不寫就表示不區分
執行計畫
參考資料:SQL 觀看執行計畫重點
在分析執行計畫時,我們不能只單看成本(CBO),應該將 Statistics I/O、Statistics Time 也列入分析中,可以先執行以下 SQL 來觀察 Logical Read 最高是發生在哪一個
1 | SET STATISTICS IO ON; |
查詢 SQL Server 目前使用者連線數
查詢目前連線數
1 | USE master |
查詢目前連線明細
1 | USE master |
刪除指定的 Session 只要下 KILL 52 其中 52 是透或上面方法查到的 session_id,這樣就可以把咬住的連線踢出去了
DBLink 連線至另一台資料庫做查詢的動作
參考文章:SQL Server 使用 OpenQuery 以及傳遞參數
先建立連結
1 | exec sp_addlinkedserver 'DBName','','SQLOLEDB','127.0.0.1' |
以下範例,在資料表前,先指定哪一個 SQL Server
1 | INSERT INTO Area |
建立完 DBlink 後,可使用 OPENQUERY 的方式,對遠端資料庫做查詢
1 | SELECT * FROM OPENQUERY(PROD, 'select sysdate from dual') |
使用 SQL 指令取得資料表內的欄位名稱
1 | SELECT NAME, * |
使用 SQL 指令取得所有資料表名稱
1 | SELECT TABLE_NAME, * |
使用 SQL 指令查詢資料庫定序(Collation)
1 | SELECT name, collation_name |
列出資料庫檔案的實際路徑
每個 Databse 檔案都會可以由 sys.master_files 這個 View 取得相關的資訊。如果要列出 DB Server 中資料庫檔案的實際路徑,就可以透過以下的 SQL 得到。
1 | SELECT name, physical_name FROM sys.master_files; |
INFORMATION_SCHEMA 是訊息資料庫,其中保存著關於資料庫伺服器所維護的所有其他資料庫的訊息
透過下列 SQL,可找出有具有特定關鍵字的預存程序或函數
1 | SELECT ROUTINE_NAME, ROUTINE_DEFINITION |
取得資料表的欄位名稱
1 | SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID('TableName') |
搜尋資料庫所有欄位名稱,可以使用這兩種語法
1 | SELECT * FROM SYSCOLUMNS |
取得資料庫中所有資料表的名稱,可以使用以下語法
1 | SELECT * FROM INFORMATION_SCHEMA.TABLES |
小技巧
1 | sp_who --可查看目前連線id |
查詢相關的版本資料
1 | SELECT RIGHT(LEFT(@@VERSION,25),4) N'產品版本編號' , |
取得資料庫中各 Table 的使用量資訊
參考資料:https://dotblogs.com.tw/rainmaker/2012/02/02/67498
1 | SET NOCOUNT ON |
將欄位識別值種子歸零
1 | DBCC CHECKIDENT(dbo.TableName, RESEED, 0) |
DATEPART 取得年、月、日及其它時間單位值
1 | SELECT getdate() |
資料來源:MSDN DATEPART (Transact-SQL)
SQL Server 資料類型對應
SQL Server 和 .NET 是以不同的型別系統為基礎,可以使用下表來推斷 SQL Server 和 .NET 型別類型對應。
REF: SQL Server 資料類型對應
DbType列舉:指定 .NET 資料提供者的欄位、屬性或 Parameter 物件的資料類型。(Docs)SqlDbType列舉:指定欄位的 SQL Server 特定的資料型別與屬性,以便在 SqlParameter 中使用。(Docs)
| SQL Server Database Engine 類型 | .NET Framework 類型 | SqlDbType 列舉型別 | DbType 列舉型別 |
|---|---|---|---|
| BIGINT | Int64 | SqlDbType.BigInt |
DbType.Int64 |
| BINARY | Byte[] | SqlDbType.VarBinary |
DbType.Binary |
| bit | Boolean | SqlDbType.Bit |
DbType.Boolean |
| char | String、Char[] | SqlDbType.Char |
DbType.AnsiStringFixedLength, DbType.String |
| date (SQL Server 2008 及以後版本) | Datetime | SqlDbType.Date |
DbType.Date |
| Datetime | Datetime | SqlDbType.DateTime |
DbType.DateTime |
| datetime2 (SQL Server 2008 及以後版本) | Datetime | SqlDbType.DateTime2 |
DbType.DateTime2 |
| datetimeoffset (SQL Server 2008 及以後版本) | DateTimeOffset | SqlDbType.DateTimeOffset |
DbType.DateTimeOffset |
| decimal | Decimal | SqlDbType.Decimal |
DbType.Decimal |
| FILESTREAM attribute (varbinary(max)) | Byte[] | SqlDbType.VarBinary |
DbType.Binary |
| FLOAT | Double | SqlDbType.Float |
DbType.Double |
| image | Byte[] | SqlDbType.Binary |
DbType.Binary |
| int | Int32 | SqlDbType.Int |
DbType.Int32 |
| money | Decimal | SqlDbType.Money |
DbType.Decimal |
| NCHAR | String、Char[] | SqlDbType.NChar |
DbType.StringFixedLength |
| ntext | String、Char[] | SqlDbType.NText |
DbType.String |
| NUMERIC | Decimal | SqlDbType.Decimal |
DbType.Decimal |
| NVARCHAR | String、Char[] | SqlDbType.NVarChar |
DbType.String |
| real | Single | SqlDbType.Real |
DbType.Single |
| rowversion | Byte[] | SqlDbType.Timestamp |
DbType.Binary |
| smalldatetime | Datetime | SqlDbType.DateTime |
DbType.DateTime |
| SMALLINT | Int16 | SqlDbType.SmallInt |
DbType.Int16 |
| SMALLMONEY | Decimal | SqlDbType.SmallMoney |
DbType.Decimal |
| sql_variant | Object | SqlDbType.Variant |
DbType.Object |
| text | String、Char[] | SqlDbType.Text |
DbType.String |
| time (SQL Server 2008 及以後版本) | TimeSpan | SqlDbType.Time |
DbType.Time |
| timestamp | Byte[] | SqlDbType.Timestamp |
DbType.Binary |
| TINYINT | Byte | SqlDbType.TinyInt |
DbType.Byte |
| UNIQUEIDENTIFIER | Guid | SqlDbType.UniqueIdentifier |
DbType.Guid |
| varbinary | Byte[] | SqlDbType.VarBinary |
DbType.Binary |
| varchar | String、Char[] | SqlDbType.VarChar |
DbType.AnsiString, DbType.String |
| xml | Xml | SqlDbType.Xml |
DbType.Xml |
SQL 字串樣式轉換為日期格式 CAST 和 CONVERT
臨時找資料,方便又上手的查詢日期方式:
1 | -- 換掉 Table 和 Date_Column 名稱 |
字串格式轉換為日期格式範例:
1 | -- SQL Server string to date / datetime conversion - datetime string format sql server |
資料來源:MSDN CAST 和 CONVERT (Transact-SQL)
查詢 SQL Agent 內排程相關訊息
1 | --Enable : 代表這Job是否有被啟動 |
有上面資訊後,就可以去查詢每個 Job 的執行狀況跟該 Job 內執行那些 Step,更重要的是若是發現其中有些 Step 執行時間有越來越長時
1 | SELECT SH.instance_id |
使用 DBCC LOG 來檢視交易記錄檔內容。
DBCC LOG: This command is used to view the transaction log for the specified database.
Syntax: DBCC log ({dbid|dbname}, [, type={-1|0|1|2|3|4}])
Where: dbid or dbname - Enter either the dbid or the name of the database
type - is the type of output, and includes these options:
- 0 - minimum information (operation, context, transaction id)
- 1 - more information (plus flags, tags, row length, description)
- 2 - very detailed information (plus object name, index name, page id, slot id)
- 3 - full information about each operation
- 4 - full information about each operation plus hexadecimal dump of the current transaction log’s row.
- -1 - full information about each operation plus hexadecimal dump of the current transaction log’s row, plus Checkpoint Begin, DB Version, Max XDESID by default, type = 0
To view the transaction log for the master database, run the following command: DBCC log (master)
雜項
1 | --若有大批新增或修改資料,建議執行更新統計資料和更新資料列計數,以避免查詢資料會有效能緩慢的問題 |
1 | --參考資料網站http://msdn.microsoft.com/en-us/library/ms187348.aspx |
1 | --參考資料網站http://msdn.microsoft.com/en-us/library/ms188414.aspx |
1 | --顯示或變更目前伺服器執行個體的全域組態設定 |
1 | --檢查資料結構(check the database structure) |
1 | --顯示統計資訊內容 |
1 | --刪除統計資訊 |
1 | --顯示資料庫資訊 |
1 | --顯示資料庫相關資訊 |
1 | --顯示單一資料庫的資訊,在每一桶資料庫中皆有下列系統資料表 |
1 | --顯示資料庫物件資訊 |
1 | ----[以下指令SQL SERVER 2005 以上版本才可以使用]---- |
參考資料: