主要模块作用
- SNI (Server Network Interface): 主要负责SQL Server与网络传输接收资料
- Relation Engine:数据库的核心,解析所有SQL语法、运算最高的查询效率
- Storage Engine: 主要决定数据库的存取方式,Memory(内存) or Disk(硬盘)
- Buffer Pool: SQL Server内存中主要存放的快照内容(data or Query Plan)
Query的流程
- Client端送出SQL Query通过TDS(Tabular Data Stream)通讯协议送至SQL Server。例如:Select * from tb_name。
- SQL Server SNI 收到该指令,转交由Cmd Parser处理,解析该指令与语法。
- Cmd Parser 转交由Optimizer计算怎样的执行方式会比较效率,要透过Index Scan or Index Seek,如果没有Index要怎样存取等。根据数据的量、Query语法、join table、统计资讯等,相对计算出较便宜的cost执行。
- 选择较便宜cost的query plan之后,交由Query Executor执行。
- SQL执行时,Access Methods会考量如何存取所要的资料,通过内存或者硬盘。
- 6/7Buff Manager会协助管理存取记忆体的资料内容。如果记忆体中已有之前的资料或者query plan,Buffer Manager会由记忆体直接取用,否则就到硬盘中存取。
- 8/9/10 接着将取到的资料回传,Query Executor =>SNI=>再通过SNI网络传输至Client。
Query的流程跟数据库效能的关系
- Query需要经常Re-Compile,Recompile会耗用CPU性能
- Index会间接影响Query Plan与数据库存取的方式、查询的效率等
- Select * ...这样的查询会增加SQL SERVER到磁盘的存取的次数以及SNI与网络资料量的传输
- 内存的大小会影响data cache与plan cache是不是有效率。对于电脑来说,至内存(Memory)存取的单位为naro sec,而至硬盘的存取却是mili sec。
CPU Pressure
有可能是 CPU privileged time造成 > 因为high Disk I/O > 因为SQL Server 找不到 memory cache 资料,也可能是因为query的语法造成需要常常Re-compile。
Memory Pressure
- page in/out 的次数很多
- 内存很小
- 因为查询语法造成
- Index没有效率
- Memory Pressure可以从Available Bytes, Page out, Page Life Expectancy等performance counters中进一步观察,确定原因。