Microsoft SQL Server 2008技术内幕:T-SQL查询---------查询优化
示例数据库:
-- 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)
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 );
-- 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生成数据透视图来查看新增等待时间信息
-- 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
细化到数据库/文件级别
-- 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 脚本如下
针对生产环镜中的工作负荷跟踪有时需要几小时,有的却要几天.
--------------------------------------------------------------------- -- 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
启动跟踪
-- 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项时)
-- 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信息需要先清空缓存
要查看查询的运行时间还要先清空缓存中的执行计划
-- 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查询---------查询优化相关推荐
- Microsoft SQL Server 2008技术内幕:T-SQL查询——读书笔记(全)
特别注意: 本笔记不适合初学者 SQL的官方(ANSI)发音是:ess kyooell,但更多的人叫它sequel. ** 第一章:逻辑查询处理** 在sql server中负责实际工作计划执行的是查 ...
- 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. 分析--> ...
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改
插入数据 T-SQL提供了几种数据插入的语句:INSERT VALUES.INSERT SELECT.INSERT EXEC.SELECT INTO及BULK INSERT. INSERT VALUE ...
- Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理
Three-Valued Logic(三值逻辑) SQL values: TRUE, FALSE, UNKNOWN 由于查询筛选器中 (ON, WHERE, and HAVING) 将UNKNOW认定 ...
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询
SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别 ...
- 安装SQL SERVER 2008时出现了SQL SERVER 2005 Express Tool Installed 的错误
安装SQL SERVER 2008时出现了SQL SERVER 2005 Express Tool Installed 的错误,这种情况一般出现在系统中已安装SQL Server 2005 的情况,其 ...
- SQL Server 2008远程连接时SQL数据库不成功怎么办
注:复制于http://www.3lian.com/edu/2013/05-13/69677.html ; 远程连接SQL Server 2008,服务器端和客户端配置 关键设置: 第一步(SQL20 ...
- SQL SERVER 2008 登陆失败(SQL和windows都没有对应的权限)
昨天在测试一些权限今天早上来就发现SQL SERVER 登陆不上去,报错为: 用户登陆失败:消息 18456,级别 14,状态 1,服务器 XXX,第 1 行 . 用户 'XXX' 登录失败.我的服 ...
- Sql Server 2008的客户端连接工具SQL Server Management Studio连接Sql Server 2012出现的索引超出了数组界限的错误
使用2008版的SQL Server Management Studio远程连接Sql Server2012会出现如下的错误,'索引超出了数组界限的错误',当刚打开连接工具就会报如下图的错误: 解决 ...
最新文章
- SCOPE_IDENTITY()
- 自然语言处理 matlab,程序员罗杰
- CloudStack 4.3功能前瞻
- [个人笔记] 关于linux的常见问题合集
- 鼠标右键菜单怎么截图?
- MDIO接口FPGA代码
- wdr7660虚拟服务器设置,TL-WDR7660千兆版路由器怎么设置密码?
- 简单实现RPC/RMI框架
- win10蓝牙已配对连接不上_win10系统下蓝牙耳机连接不上如何解决
- 关于校园流浪猫狗的调查报告 新生研讨课校内调查
- H5视频会议,直播,通话,教学,支持Webrtc、rtmp、sip、rtsp转协议、IPCAM、白板、桌面共享、免插件、web全平台、视频融合系统研发笔记。...
- Android的涂鸦智能设备几种入网方式
- LeetCode-1264. 页面推荐(中等)
- 【C语言小游戏】计算器
- 手机沙盒隔离软件_虚拟隔离沙箱|隔离沙箱(BufferZone Pro)下载 v4.07 免费版 - 121下载站...
- 刚入职一个月的程序猿
- JavaMail 学习讲解
- 无限循环小数展示算法题
- 批处理启动或停止打印机服务
- 马斯克成全球首富!万字最新访谈披露,信息量极大,远见令人震撼
热门文章
- docker 容器重命名
- Redis开发:hash存储自定义Java对象及value的序列化器设置
- Java并发编程--不要使用字符串常量作为synchronized锁对象
- RabbitMQ消息confirm确认机制
- Mybatis注解实现一对多关联映射(@Many)
- 计算机二级考数组吗,数组-Java语言程序设计重要笔记 计算机二级考试
- Java匿名内部类总结
- php array_only,php可以定义数组的常量吗
- 如何连接两个窗口JAVA_java-如何连接两个ArrayLists?
- 堆内存和数据结构堆之间的关系是什么?