示例数据库:

-- Sample Data for this Chapter

-- Listing 4-1: Creation Script for Sample Database and Tables
SET NOCOUNT ON;
USE master;
IF DB_ID('Performance') IS NULLCREATE DATABASE Performance;
GO
USE Performance;
GO-- Creating and Populating the Nums Auxiliary Table
SET NOCOUNT ON;
IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULLDROP TABLE dbo.Nums;
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;INSERT INTO dbo.Nums(n) VALUES(1);
WHILE @rc * 2 <= @max
BEGININSERT INTO dbo.Nums(n) SELECT n + @rc FROM dbo.Nums;SET @rc = @rc * 2;
ENDINSERT INTO dbo.Nums(n)SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO-- Drop Data Tables if Exist
IF OBJECT_ID('dbo.EmpOrders', 'V') IS NOT NULLDROP VIEW dbo.EmpOrders;
GO
IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULLDROP TABLE dbo.Orders;
GO
IF OBJECT_ID('dbo.Customers', 'U') IS NOT NULLDROP TABLE dbo.Customers;
GO
IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULLDROP TABLE dbo.Employees;
GO
IF OBJECT_ID('dbo.Shippers', 'U') IS NOT NULLDROP TABLE dbo.Shippers;
GO-- Data Distribution Settings
DECLARE@numorders   AS INT,@numcusts    AS INT,@numemps     AS INT,@numshippers AS INT,@numyears    AS INT,@startdate   AS DATETIME;SELECT@numorders   =   1000000,@numcusts    =     20000,@numemps     =       500,@numshippers =         5,@numyears    =         4,@startdate   = '20050101';-- Creating and Populating the Customers Table
CREATE TABLE dbo.Customers
(custid   CHAR(11)     NOT NULL,custname NVARCHAR(50) NOT NULL
);INSERT INTO dbo.Customers(custid, custname)SELECT'C' + RIGHT('000000000' + CAST(n AS VARCHAR(10)), 10) AS custid,N'Cust_' + CAST(n AS VARCHAR(10)) AS custnameFROM dbo.NumsWHERE n <= @numcusts;ALTER TABLE dbo.Customers ADDCONSTRAINT PK_Customers PRIMARY KEY(custid);-- Creating and Populating the Employees Table
CREATE TABLE dbo.Employees
(empid     INT          NOT NULL,firstname NVARCHAR(25) NOT NULL,lastname  NVARCHAR(25) NOT NULL
);INSERT INTO dbo.Employees(empid, firstname, lastname)SELECT n AS empid,N'Fname_' + CAST(n AS NVARCHAR(10)) AS firstname,N'Lname_' + CAST(n AS NVARCHAR(10)) AS lastnameFROM dbo.NumsWHERE n <= @numemps;ALTER TABLE dbo.Employees ADDCONSTRAINT PK_Employees PRIMARY KEY(empid);-- Creating and Populating the Shippers Table
CREATE TABLE dbo.Shippers
(shipperid   VARCHAR(5)   NOT NULL,shippername NVARCHAR(50) NOT NULL
);INSERT INTO dbo.Shippers(shipperid, shippername)SELECT shipperid, N'Shipper_' + shipperid AS shippernameFROM (SELECT CHAR(ASCII('A') - 2 + 2 * n) AS shipperidFROM dbo.NumsWHERE n <= @numshippers) AS D;ALTER TABLE dbo.Shippers ADDCONSTRAINT PK_Shippers PRIMARY KEY(shipperid);-- Creating and Populating the Orders Table
CREATE TABLE dbo.Orders
(orderid   INT        NOT NULL,custid    CHAR(11)   NOT NULL,empid     INT        NOT NULL,shipperid VARCHAR(5) NOT NULL,orderdate DATETIME   NOT NULL,filler    CHAR(155)  NOT NULL DEFAULT('a')
);INSERT INTO dbo.Orders(orderid, custid, empid, shipperid, orderdate)SELECT n AS orderid,'C' + RIGHT('000000000'+ CAST(1 + ABS(CHECKSUM(NEWID())) % @numcustsAS VARCHAR(10)), 10) AS custid,1 + ABS(CHECKSUM(NEWID())) % @numemps AS empid,CHAR(ASCII('A') - 2+ 2 * (1 + ABS(CHECKSUM(NEWID())) % @numshippers)) AS shipperid,DATEADD(day, n / (@numorders / (@numyears * 365.25)), @startdate)-- late arrival with earlier date- CASE WHEN n % 10 = 0THEN 1 + ABS(CHECKSUM(NEWID())) % 30ELSE 0 END AS orderdateFROM dbo.NumsWHERE n <= @numordersORDER BY CHECKSUM(NEWID());CREATE CLUSTERED INDEX idx_cl_od ON dbo.Orders(orderdate);CREATE NONCLUSTERED INDEX idx_nc_sid_od_i_cidON dbo.Orders(shipperid, orderdate)INCLUDE(custid);CREATE UNIQUE INDEX idx_unc_od_oid_i_cid_eidON dbo.Orders(orderdate, orderid)INCLUDE(custid, empid);ALTER TABLE dbo.Orders ADDCONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED(orderid),CONSTRAINT FK_Orders_CustomersFOREIGN KEY(custid)    REFERENCES dbo.Customers(custid),CONSTRAINT FK_Orders_EmployeesFOREIGN KEY(empid)     REFERENCES dbo.Employees(empid),CONSTRAINT FK_Orders_ShippersFOREIGN KEY(shipperid) REFERENCES dbo.Shippers(shipperid);
GO

快速建成1--100000数值表的语句

DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1;

INSERT INTO dbo.Nums(n) VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
  INSERT INTO dbo.Nums(n) SELECT n + @rc FROM dbo.Nums;
  SET @rc = @rc * 2;
END

INSERT INTO dbo.Nums(n)
  SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO

生成随机custId,empId,shipperid 的语句

1+ABS(CHECKSUM(NEWID())%@NUMBERMAX  生成 1--->@NUMBERMAX内随机整数

INSERT INTO dbo.Orders(orderid, custid, empid, shipperid, orderdate)
  SELECT n AS orderid,
    'C' + RIGHT('000000000'
            + CAST(
                1 + ABS(CHECKSUM(NEWID())) % @numcusts
                AS VARCHAR(10)), 10) AS custid,
    1 + ABS(CHECKSUM(NEWID())) % @numemps AS empid,
    CHAR(ASCII('A') - 2
           + 2 * (1 + ABS(CHECKSUM(NEWID())) % @numshippers)) AS shipperid,
      DATEADD(day, n / (@numorders / (@numyears * 365.25)), @startdate)
        -- late arrival with earlier date

   ---在这个例子中是生成随机数是四年,四年有只有一个闰年,平均每年365.25天,这样跟据订单号可以算出每个订单大约放在哪一天,每个订单号为10倍的时候作了一些处理,+-31天,所以10倍的订单号有可能出现在上个月
        - CASE WHEN n % 10 = 0
            THEN 1 + ABS(CHECKSUM(NEWID())) % 30
            ELSE 0
          END AS orderdate
  FROM dbo.Nums
  WHERE n <= @numorders
  ORDER BY CHECKSUM(NEWID());

优化方法论

返回系统里的等待信息

返回系统的等待信息

1 SELECT
2   wait_type,
3   waiting_tasks_count,
4   wait_time_ms,
5   max_wait_time_ms,
6   signal_wait_time_ms
7 FROM sys.dm_os_wait_stats
8 ORDER BY wait_type;

signal_wait_time_ms 表示从线程收到资源可用信号开始到得到CPU时间,开始资源为止经历的时间,如果这个属性很高,就表明CPU有问题.

分离重量级的等待

分离重量级的等待

-- Isolate top waits
WITH Waits AS
(SELECTwait_type,wait_time_ms / 1000. AS wait_time_s,100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct,ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn,100. * signal_wait_time_ms / wait_time_ms as signal_pctFROM sys.dm_os_wait_statsWHERE wait_time_ms > 0AND wait_type NOT LIKE N'%SLEEP%'AND wait_type NOT LIKE N'%IDLE%'AND wait_type NOT LIKE N'%QUEUE%'    AND wait_type NOT IN(  N'CLR_AUTO_EVENT', N'REQUEST_FOR_DEADLOCK_SEARCH', N'SQLTRACE_BUFFER_FLUSH'/* filter out additional irrelevant waits */ )
)
SELECTW1.wait_type, CAST(W1.wait_time_s AS NUMERIC(12, 2)) AS wait_time_s,CAST(W1.pct AS NUMERIC(5, 2)) AS pct,CAST(SUM(W2.pct) AS NUMERIC(5, 2)) AS running_pct,CAST(W1.signal_pct AS NUMERIC(5, 2)) AS signal_pct
FROM Waits AS W1JOIN Waits AS W2ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct, W1.signal_pct
HAVING SUM(W2.pct) - W1.pct < 80 -- percentage thresholdOR W1.rn <= 5
ORDER BY W1.rn;
GO

这个语句返回累计等待时间(从最大的等待时间的等待类型向下加)占总等待时间达80%的等待类型 或 等待时间为前5位的等待类型

收集等待信息

这个可以使用SQL SERVER中的功能 Server Actity 来实现

也可以用一张表来不间断的收集当前的累计等待时间,通过计算差值来算出间隔内的等待时间(Interval Wait Time)

创建WaitStats收集表

USE Performance;
IF OBJECT_ID('dbo.WaitStats', 'U') IS NOT NULL DROP TABLE dbo.WaitStats;CREATE TABLE dbo.WaitStats
(dt                  DATETIME     NOT NULL DEFAULT (CURRENT_TIMESTAMP),wait_type           NVARCHAR(60) NOT NULL,waiting_tasks_count BIGINT       NOT NULL,wait_time_ms        BIGINT       NOT NULL,max_wait_time_ms    BIGINT       NOT NULL,signal_wait_time_ms BIGINT       NOT NULL
);

定义一个时间间隔的任务(比如1小时),运行下面代码,填充收集表

-- Load waitstats data on regular intervals
INSERT INTO Performance.dbo.WaitStats(wait_type, waiting_tasks_count, wait_time_ms,max_wait_time_ms, signal_wait_time_ms)SELECTwait_type, waiting_tasks_count, wait_time_ms,max_wait_time_ms, signal_wait_time_msFROM sys.dm_os_wait_statsWHERE wait_type NOT IN (N'MISCELLANEOUS');

创建下列函数,处理数据收集表,返回间隔等待信息

-- Creation script for IntervalWaits function
IF OBJECT_ID('dbo.IntervalWaits', 'IF') IS NOT NULLDROP FUNCTION dbo.IntervalWaits;
GOCREATE FUNCTION dbo.IntervalWaits(@fromdt AS DATETIME, @todt AS DATETIME)
RETURNS TABLE
ASRETURNWITH Waits AS(SELECT dt, wait_type, wait_time_ms,ROW_NUMBER() OVER(PARTITION BY wait_typeORDER BY dt) AS rnFROM dbo.WaitStats)SELECT Prv.wait_type, Prv.dt AS start_time,CAST((Cur.wait_time_ms - Prv.wait_time_ms)/ 1000. AS NUMERIC(12, 2)) AS interval_wait_sFROM Waits AS CurJOIN Waits AS PrvON Cur.wait_type = Prv.wait_typeAND Cur.rn = Prv.rn + 1AND Prv.dt >= @fromdtAND Prv.dt < DATEADD(day, 1, @todt)
GO

可以使用简单的查询来分析间隔等待时间,比如下面的查询,返回间隔内的新增等待时间,且按区间内的总新增时间倒序

使用收集表,按区间内所有间隔新增时间总和倒序显示

SELECT wait_type, start_time, interval_wait_s
FROM dbo.IntervalWaits('20090212', '20090213') AS F
ORDER BY SUM(interval_wait_s) OVER(PARTITION BY wait_type) DESC,wait_type, start_time;
GO

也可以将函数返回的表放在Excel中,通过Excel生成数据透视图来查看新增等待时间信息

提供给Excel的数据视图

-- Prepare view for pivot table
IF OBJECT_ID('dbo.IntervalWaitsSample', 'V') IS NOT NULLDROP VIEW dbo.IntervalWaitsSample;
GOCREATE VIEW dbo.IntervalWaitsSample
ASSELECT wait_type, start_time, interval_wait_s
FROM dbo.IntervalWaits('20090212', '20090213') AS F;
GO

 细化到数据库/文件级别

分析数据库IO

-- Analyze DB IO
WITH DBIO AS
(SELECTDB_NAME(IVFS.database_id) AS db,MF.type_desc,SUM(IVFS.num_of_bytes_read + IVFS.num_of_bytes_written) AS io_bytes,SUM(IVFS.io_stall) AS io_stall_msFROM sys.dm_io_virtual_file_stats(NULL, NULL) AS IVFSJOIN sys.master_files AS MFON IVFS.database_id = MF.database_idAND IVFS.file_id = MF.file_idGROUP BY DB_NAME(IVFS.database_id), MF.type_desc
)
SELECT db, type_desc, CAST(1. * io_bytes / (1024 * 1024) AS NUMERIC(12, 2)) AS io_mb,CAST(io_stall_ms / 1000. AS NUMERIC(12, 2)) AS io_stall_s,CAST(100. * io_stall_ms / SUM(io_stall_ms) OVER()AS NUMERIC(10, 2)) AS io_stall_pct,ROW_NUMBER() OVER(ORDER BY io_stall_ms DESC) AS rn
FROM DBIO
ORDER BY io_stall_ms DESC;

细化到进程级别

直接使用SQL SERVER PROFILER GUI会有一些性能问题,因为输出会同时到目标文件和客户端,可以由GUI生成TSQL 脚本如下

针对生产环镜中的工作负荷跟踪有时需要几小时,有的却要几天.

SQL TRACE跟踪脚本过程

---------------------------------------------------------------------
-- Trace Performance Workload
---------------------------------------------------------------------SET NOCOUNT ON;
USE master;
GOIF OBJECT_ID('dbo.PerfworkloadTraceStart', 'P') IS NOT NULLDROP PROC dbo.PerfworkloadTraceStart;
GOCREATE PROC dbo.PerfworkloadTraceStart@dbid      AS INT,@tracefile AS NVARCHAR(245),@traceid   AS INT OUTPUT
AS-- Create a Queue
DECLARE @rc          AS INT;
DECLARE @maxfilesize AS BIGINT;SET @maxfilesize = 5;EXEC @rc = sp_trace_create @traceid OUTPUT, 0, @tracefile, @maxfilesize, NULL
IF (@rc != 0) GOTO error;-- Set the events
DECLARE @on AS BIT;
SET @on = 1;-- RPC:Completed
exec sp_trace_setevent @traceid, 10, 15, @on;
exec sp_trace_setevent @traceid, 10, 8, @on;
exec sp_trace_setevent @traceid, 10, 16, @on;
exec sp_trace_setevent @traceid, 10, 48, @on;
exec sp_trace_setevent @traceid, 10, 1, @on;
exec sp_trace_setevent @traceid, 10, 17, @on;
exec sp_trace_setevent @traceid, 10, 10, @on;
exec sp_trace_setevent @traceid, 10, 18, @on;
exec sp_trace_setevent @traceid, 10, 11, @on;
exec sp_trace_setevent @traceid, 10, 12, @on;
exec sp_trace_setevent @traceid, 10, 13, @on;
exec sp_trace_setevent @traceid, 10, 6, @on;
exec sp_trace_setevent @traceid, 10, 14, @on;-- SP:Completed
exec sp_trace_setevent @traceid, 43, 15, @on;
exec sp_trace_setevent @traceid, 43, 8, @on;
exec sp_trace_setevent @traceid, 43, 48, @on;
exec sp_trace_setevent @traceid, 43, 1, @on;
exec sp_trace_setevent @traceid, 43, 10, @on;
exec sp_trace_setevent @traceid, 43, 11, @on;
exec sp_trace_setevent @traceid, 43, 12, @on;
exec sp_trace_setevent @traceid, 43, 13, @on;
exec sp_trace_setevent @traceid, 43, 6, @on;
exec sp_trace_setevent @traceid, 43, 14, @on;-- SP:StmtCompleted
exec sp_trace_setevent @traceid, 45, 8, @on;
exec sp_trace_setevent @traceid, 45, 16, @on;
exec sp_trace_setevent @traceid, 45, 48, @on;
exec sp_trace_setevent @traceid, 45, 1, @on;
exec sp_trace_setevent @traceid, 45, 17, @on;
exec sp_trace_setevent @traceid, 45, 10, @on;
exec sp_trace_setevent @traceid, 45, 18, @on;
exec sp_trace_setevent @traceid, 45, 11, @on;
exec sp_trace_setevent @traceid, 45, 12, @on;
exec sp_trace_setevent @traceid, 45, 13, @on;
exec sp_trace_setevent @traceid, 45, 6, @on;
exec sp_trace_setevent @traceid, 45, 14, @on;
exec sp_trace_setevent @traceid, 45, 15, @on;-- SQL:BatchCompleted
exec sp_trace_setevent @traceid, 12, 15, @on;
exec sp_trace_setevent @traceid, 12, 8, @on;
exec sp_trace_setevent @traceid, 12, 16, @on;
exec sp_trace_setevent @traceid, 12, 48, @on;
exec sp_trace_setevent @traceid, 12, 1, @on;
exec sp_trace_setevent @traceid, 12, 17, @on;
exec sp_trace_setevent @traceid, 12, 6, @on;
exec sp_trace_setevent @traceid, 12, 10, @on;
exec sp_trace_setevent @traceid, 12, 14, @on;
exec sp_trace_setevent @traceid, 12, 18, @on;
exec sp_trace_setevent @traceid, 12, 11, @on;
exec sp_trace_setevent @traceid, 12, 12, @on;
exec sp_trace_setevent @traceid, 12, 13, @on;-- SQL:StmtCompleted
exec sp_trace_setevent @traceid, 41, 15, @on;
exec sp_trace_setevent @traceid, 41, 8, @on;
exec sp_trace_setevent @traceid, 41, 16, @on;
exec sp_trace_setevent @traceid, 41, 48, @on;
exec sp_trace_setevent @traceid, 41, 1, @on;
exec sp_trace_setevent @traceid, 41, 17, @on;
exec sp_trace_setevent @traceid, 41, 10, @on;
exec sp_trace_setevent @traceid, 41, 18, @on;
exec sp_trace_setevent @traceid, 41, 11, @on;
exec sp_trace_setevent @traceid, 41, 12, @on;
exec sp_trace_setevent @traceid, 41, 13, @on;
exec sp_trace_setevent @traceid, 41, 6, @on;
exec sp_trace_setevent @traceid, 41, 14, @on;-- Set the Filters-- Application name filter
EXEC sp_trace_setfilter @traceid, 10, 0, 7, N'SQL Server Profiler%';
-- Database ID filter
EXEC sp_trace_setfilter @traceid, 3, 0, 0, @dbid;-- Set the trace status to start
EXEC sp_trace_setstatus @traceid, 1;-- Print trace id and file name for future references
PRINT 'Trace ID: ' + CAST(@traceid AS VARCHAR(10))+ ', Trace File: ''' + @tracefile + '.trc''';GOTO finish;error:
PRINT 'Error Code: ' + CAST(@rc AS VARCHAR(10));finish:
GO

启动跟踪

View Code

-- Start the trace
DECLARE @dbid AS INT, @traceid AS INT;
SET @dbid = DB_ID('Performance');EXEC master.dbo.PerfworkloadTraceStart@dbid      = @dbid,@tracefile = 'c:\temp\Perfworkload 20090212',@traceid   = @traceid OUTPUT;
GO

停止跟踪

停止和关闭跟踪

-- Stop the trace (assuming trace id was 2)
EXEC sp_trace_setstatus 2, 0;
EXEC sp_trace_setstatus 2, 2;
GO

分析跟跟数据,使用fn_trace_gettable函数把跟踪文件加载到表

加载跟踪文件进表

-- Load trace data to table
SET NOCOUNT ON;
USE Performance;
IF OBJECT_ID('dbo.Workload', 'U') IS NOT NULL DROP TABLE dbo.Workload;
GOSELECT CAST(TextData AS NVARCHAR(MAX)) AS tsql_code,Duration AS duration
INTO dbo.Workload
FROM sys.fn_trace_gettable('c:\temp\Perfworkload 20090212.trc', NULL) AS T
WHERE Duration > 0AND EventClass IN(41, 45);
GO

分析跟踪表

分析跟踪表

-- Aggregate trace data by query
SELECTtsql_code,SUM(duration) AS total_duration
FROM dbo.Workload
GROUP BY tsql_code;

缓存中的查询计划,和上面的SQL TRACE方法不同的是,这里不包含查询计划不在缓存中的查询(例如查询或过程使用的RECOMPILE项时)

DMV查询统计

-- Query Statistics
SELECT TOP (5)MAX(query) AS sample_query,SUM(execution_count) AS cnt,SUM(total_worker_time) AS cpu,SUM(total_physical_reads) AS reads,SUM(total_logical_reads) AS logical_reads,SUM(total_elapsed_time) AS duration
FROM (SELECT QS.*,SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,((CASE statement_end_offset WHEN -1 THEN DATALENGTH(ST.text)ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1) AS queryFROM sys.dm_exec_query_stats AS QSCROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) AS STCROSS APPLY sys.dm_exec_plan_attributes(QS.plan_handle) AS PAWHERE PA.attribute = 'dbid'AND PA.value = DB_ID('Performance')) AS D
GROUP BY query_hash
ORDER BY duration DESC;

物理读: 由硬盘上的块读到缓存中,每读一个块就是一个物理读

逻辑读: 从缓存中每读一行就是一次逻辑读

所以要测量查询的I/O信息需要先清空缓存

要查看查询的运行时间还要先清空缓存中的执行计划

查看查询IO信息

-- First clear cache
DBCC DROPCLEANBUFFERS;-- Then run
SET STATISTICS IO ON;SELECT orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20080101'AND orderdate < '20080201';
GOSET STATISTICS IO OFF;
GO

查看查询的运行时间

---------------------------------------------------------------------
-- Measuring Runtime of Queries
----------------------------------------------------------------------- STATISTICS TIME-- First clear cache
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;-- Then run
SET STATISTICS TIME ON;SELECT orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20080101'AND orderdate < '20080201';SET STATISTICS TIME OFF;
GO

转载于:https://www.cnblogs.com/Gravin-Gu/archive/2013/01/30/2883710.html

Microsoft SQL Server 2008技术内幕:T-SQL查询---------查询优化相关推荐

  1. Microsoft SQL Server 2008技术内幕:T-SQL查询——读书笔记(全)

    特别注意: 本笔记不适合初学者 SQL的官方(ANSI)发音是:ess kyooell,但更多的人叫它sequel. ** 第一章:逻辑查询处理** 在sql server中负责实际工作计划执行的是查 ...

  2. mysql桦仔_Microsoft SQL Server 2005技术内幕:T-SQL查询笔记

    Microsoft SQL Server 2005技术内幕:T-SQL查询笔记 目录 f f f f f f f f 第二章 物理查询处理 分析,代数化,查询优化 f f f f f. 分析--> ...

  3. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改

    插入数据 T-SQL提供了几种数据插入的语句:INSERT VALUES.INSERT SELECT.INSERT EXEC.SELECT INTO及BULK INSERT. INSERT VALUE ...

  4. Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理

    Three-Valued Logic(三值逻辑) SQL values: TRUE, FALSE, UNKNOWN 由于查询筛选器中 (ON, WHERE, and HAVING) 将UNKNOW认定 ...

  5. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询

    SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别 ...

  6. 安装SQL SERVER 2008时出现了SQL SERVER 2005 Express Tool Installed 的错误

    安装SQL SERVER 2008时出现了SQL SERVER 2005 Express Tool Installed 的错误,这种情况一般出现在系统中已安装SQL Server 2005 的情况,其 ...

  7. SQL Server 2008远程连接时SQL数据库不成功怎么办

    注:复制于http://www.3lian.com/edu/2013/05-13/69677.html ; 远程连接SQL Server 2008,服务器端和客户端配置 关键设置: 第一步(SQL20 ...

  8. SQL SERVER 2008 登陆失败(SQL和windows都没有对应的权限)

    昨天在测试一些权限今天早上来就发现SQL SERVER 登陆不上去,报错为: 用户登陆失败:消息 18456,级别 14,状态 1,服务器 XXX,第 1 行 .  用户 'XXX' 登录失败.我的服 ...

  9. Sql Server 2008的客户端连接工具SQL Server Management Studio连接Sql Server 2012出现的索引超出了数组界限的错误

    使用2008版的SQL Server  Management Studio远程连接Sql Server2012会出现如下的错误,'索引超出了数组界限的错误',当刚打开连接工具就会报如下图的错误: 解决 ...

最新文章

  1. SCOPE_IDENTITY()
  2. 自然语言处理 matlab,程序员罗杰
  3. CloudStack 4.3功能前瞻
  4. [个人笔记] 关于linux的常见问题合集
  5. 鼠标右键菜单怎么截图?
  6. MDIO接口FPGA代码
  7. wdr7660虚拟服务器设置,TL-WDR7660千兆版路由器怎么设置密码?
  8. 简单实现RPC/RMI框架
  9. win10蓝牙已配对连接不上_win10系统下蓝牙耳机连接不上如何解决
  10. 关于校园流浪猫狗的调查报告 新生研讨课校内调查
  11. H5视频会议,直播,通话,教学,支持Webrtc、rtmp、sip、rtsp转协议、IPCAM、白板、桌面共享、免插件、web全平台、视频融合系统研发笔记。...
  12. Android的涂鸦智能设备几种入网方式
  13. LeetCode-1264. 页面推荐(中等)
  14. 【C语言小游戏】计算器
  15. 手机沙盒隔离软件_虚拟隔离沙箱|隔离沙箱(BufferZone Pro)下载 v4.07 免费版 - 121下载站...
  16. 刚入职一个月的程序猿
  17. JavaMail 学习讲解
  18. 无限循环小数展示算法题
  19. 批处理启动或停止打印机服务
  20. 马斯克成全球首富!万字最新访谈披露,信息量极大,远见令人震撼

热门文章

  1. docker 容器重命名
  2. Redis开发:hash存储自定义Java对象及value的序列化器设置
  3. Java并发编程--不要使用字符串常量作为synchronized锁对象
  4. RabbitMQ消息confirm确认机制
  5. Mybatis注解实现一对多关联映射(@Many)
  6. 计算机二级考数组吗,数组-Java语言程序设计重要笔记 计算机二级考试
  7. Java匿名内部类总结
  8. php array_only,php可以定义数组的常量吗
  9. 如何连接两个窗口JAVA_java-如何连接两个ArrayLists?
  10. 堆内存和数据结构堆之间的关系是什么?