sqlserver编译
只编译一次。
在发布存储过程时就编译一次,页面上只要调用就可以,两次打开就是调用两次存储过程
2. sqlserver
摘自:http://database.ctocio.com.cn/analysis/465/7709465.shtml
【IT专家网独家】SQL Server用户自定义函数和存储过程有类似的功能,都可以创建捆绑SQL语句,存储在server中供以后使用。这样能够极大地提高工作效率,通过以下的各种做法可以减少编程所需的时间:
重复使用编程代码,减少编程开发时间。
隐藏SQL细节,把SQL繁琐的工作留给数据库开发人员,而程序开发员则集中处理高级编程语言。
维修集中化,可以在一个地方做业务上的逻辑修改,然后让这些修改自动应用到所有相关程序中。
乍看之下,用户自定义函数和存储过程的功能似乎一摸一样。但是,其实这两者之间还有一些虽然细微但是很重要的差异:
存储过程是使用EXEC命令独立调用的,而用户自定义函数是在另一个SQL语句中调用的。
l存储程序是允许用户和程序去使用存储过程,而不是允许其存取表格,这样能够增强程序安全性。与标准的SQL Server相比,存储程序限制用户行动权限方面更为细化。例如,如果你有一个货存表格,每次卖出一个货物收银员都要对表格进行更新一次(从货存中把该货品减去一件)。你可以给收银员设置权限,允许其使用decrement_item存储过程,而不是允许他们有任意修改或村表格的权限。
函数必须始终返回一个值(一个标量值或一个表格)。而存储过程可以返回一个标量值、一个表值或无需返回值。
总而言之,存储程序对SQL Server开发员来说是最有价值的宝物之一,用于数据库中,能够大大的提高工作效率,增强安全性,绝对超值。
3. SQLServer数据库收缩相关知识
SQL Server 数据库采取预先分配空间的方法来建立数据库的数据文件或者日志文件,比如数据文件的空间分配了300MB,而实际上只占用了20MB空间,这样就会造成磁盘存储空间的浪费。可以通过数据库收缩技术对数据库中的每个文件进行收缩,删除已经分配但没有使用的页。从而节省服务器的存储的成本。
官方解释:收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。
收缩后的数据库不能小于数据库最初创建时指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)设置的显式大小。
比如:如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。
不能在备份数据库时收缩数据库。 反之,也不能在数据库执行收缩操作时备份数据库。
介绍:收缩指定数据库中的数据文件大小。
语法格式:
参数说明:
介绍:收缩当前数据库的指定数据或日志文件的大小,或通过将数据从指定的文件移动到相同文件组中的其他文件来清空文件,以允许从数据库中删除该文件。文件大小可以收缩到比创建该文件时所指定的大小更小。这样会将最小文件大小重置为新值。
语法格式:
参数说明:
例如,如果创建一个10MB 的文件,然后在文件仍然为空的时候将文件收缩为2 MB,默认文件大小将设置为2 MB。这只适用于永远不会包含数据的空文件。
另附SqlServer常见问题解答
1)管理器不会主动刷新,需要手工刷新一下才能看到最新状态(性能方面的考虑)
2)很少情况下,恢复进程被挂起了。这个时候假设你要恢复并且回到可访问状态,要执行:
RESTORE database dbname with recovery
这使得恢复过程能完全结束。
3)如果你要不断恢复后面的日志文件,的确需要使数据库处于“正在还原状态”,
这通常是执行下面命令:
RESTORE database dbname with norecovery
原来SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server 服务器内存往往会占用很高。我们可以通过DBCC MemoryStatus来查看内存状态。
SQL SERVER运行时会执行两种缓存:
1. 数据缓存:执行个查询语句,SQL SERVER会将相关的数据页(SQL SERVER操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
2.执行命令缓存:在执行存储过程,自定函数时,SQL SERVER需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。
可以调用以下几个DBCC管理命令来清理这些缓存:
但是,这几个命令虽然会清除掉现有缓存,为新的缓存腾地方,但是Sql server并不会因此释放掉已经占用的内存。SQL SERVER并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整SQL SERVER可用的物理内存设置来强迫它释放内存。
解决SQLSERVER内存占用过高的方法:
1、清除所有缓存DBCC DROPLEANBUFFERS
2、调整SQLSERVER可使用的最大服务器内存。
在SQL管理器,右击实例名称
在属性实例属性里面找到内存选项
把最大内存改成合适的内存,确定后内存就会被强制释放,然后重启实例。再看看任务管理器,内存使用率就降下来啦。
1、查看连接对象
USE master
GO
--如果要指定数据库就把注释去掉
SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'
当前连接对象有67个其中‘WINAME’的主机名,‘jTDS’的进程名不属于已知常用软件,找到这台主机并解决连接问题。在360流量防火墙中查看有哪个软件连接了服务器IP,除之。
2、然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '开始时间',
[status] AS '状态',
[command] AS '命令',
dest.[text] AS 'sql语句',
DB_NAME([database_id]) AS '数据库名',
[blocking_session_id] AS '正在阻塞其他会话的会话ID',
[wait_type] AS '等待资源类型',
[wait_time] AS '等待时间',
[wait_resource] AS '等待的资源',
[reads] AS '物理读次数',
[writes] AS '写次数',
[logical_reads] AS '逻辑读次数',
[row_count] AS '返回结果行数'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC
查看是哪些SQL语句占用较大可以使用下面代码
--在SSMS里选择以文本格式显示结果
SELECT TOP 10
dest.[text] AS 'sql语句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC
3、如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '开始时间',
[status] AS '状态',
[command] AS '命令',
dest.[text] AS 'sql语句',
DB_NAME([database_id]) AS '数据库名',
[blocking_session_id] AS '正在阻塞其他会话的会话ID',
der.[wait_type] AS '等待资源类型',
[wait_time] AS '等待时间',
[wait_resource] AS '等待的资源',
[dows].[waiting_tasks_count] AS '当前正在进行等待的任务数',
[reads] AS '物理读次数',
[writes] AS '写次数',
[logical_reads] AS '逻辑读次数',
[row_count] AS '返回结果行数'
FROM sys.[dm_exec_requests] AS der
INNER JOIN [sys].[dm_os_wait_stats] AS dows
ON der.[wait_type]=[dows].[wait_type]
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC;
4、查询CPU占用最高的SQL语句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC;
5、索引缺失查询
SELECT
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
找到索引缺失的表,根据查询结果中的关键次逐一建立索引。
4. SQLSERVER 什么时候重新编译执行计划
根据数据库新状态的不同,数据库中的某些更改可能导致执行计划效率降低或无效。SQL Server 将检测到使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:
对查询所引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW)。
对执行计划所使用的任何索引进行更改。
对执行计划所使用的统计信息进行更新,这些更新可能是从语句(如 UPDATE STATISTICS)中显式生成,也可能是自动生成的。
删除执行计划所使用的索引。
显式调用 sp_recompile。
对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
对于带触发器的表,插入的或删除的表内的行数显着增长。
使用 WITH RECOMPILE 选项执行存储过程。
为了使语句正确,或要获得可能更快的查询执行计划,大多数都需要进行重新编译。
在 SQL Server 2000 中,只要批处理中的语句导致重新编译,就会重新编译整个批处理,无论此批处理是通过存储过程、触发器、即席批查询,还是通过预定义的语句进行提交。在 SQL Server 2005 和更高版本中,只会重新编译批处理中导致重新编译的语句。由于这种差异,SQL Server 2000 和更高版本中的重新编译计数不可比较。另外,由于 SQL Server 2005 和更高版本扩展了功能集,因此它们具有更多类型的重新编译。
语句级重新编译有助于提高性能,因为在大多数情况下,只有少数语句导致了重新编译并造成相关损失(指 CPU 时间和锁)。因此,避免了批处理中其他不必重新编译的语句的这些损失。
SQL Server ProfilerSP:Recompile 跟踪事件报告语句级重新编译。此跟踪事件在 SQL Server 2000 中仅报告批处理重新编译。此外,将填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必须跟踪 SP:StmtStarting 或 SP:StmtCompleted 以获取导致重新编译的 Transact-SQL 文本的做法。
跟踪事件 SQL:StmtRecompile 报告语句级重新编译。此跟踪事件可用于跟踪和调试重新编译。SP:Recompile 仅针对存储过程和触发器生成,而SQL:StmtRecompile 则针对存储过程、触发器、即席批查询、使用 sp_executesql 执行的批处理、已准备的查询和动态 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一个整数代码,用以指明重新编译的原因。
5. 璇曡堪宓屽叆寮厂QL璇瑷浣跨敤瑕佽冭槛
宓屽叆寮厂QL绋嫔簭镄刅C+SQL server 2000瀹炵幇镄勭幆澧冮厤缃
宓屽叆SQL镄凛搴旂敤绋嫔簭鍏蜂綋鍒癡C++6.0, SQL Server2000 涓嬭皟璇曞彲鍒嗕负浜旀ワ细1銆佺幆澧冨埯濮嫔寲;2銆侀勭紪璇;3銆佺紪璇;4銆佽繛鎺;5銆佽繍琛屻备笅闱㈠氨鍏朵腑閲嶈佺殑镄勬搷浣沧柟娉旷粰浠ヨ︾粏璇存槑銆
1銆佺幆澧冨埯濮嫔寲
(1) SQL Server2000涓哄叾宓屽叆寮厂QL鎻愪緵浜嗕竴姝ょ壒娈婄殑鎺ュ彛锛涢粯璁ょ殑瀹夎呮柟寮忔病链夊畨瑁呰繖姝ゆ帴鍙o绂锲犳わ纴闇瑕佹妸devtools.rar瑙e帇鍒癝QLServer镄勭郴缁熸棩褰曚笅锛埚嵆鏂囦欢澶筪evtools涓镄勬墍链夋枃浠讹级;濡傛灉镎崭綔绯荤粺瀹夎呭湪C鐩桡纴鍒橲QL Server镄勭郴缁熺洰褰曟槸C:\Program Files\Microsoft SQL Server銆傦纸鎴 鍦ㄥ畨瑁匨icrosoft SQL Server 2000镞堕夋嫨瀹夎匘evelopment Tools锛屼负浣跨敤宓屽叆寮厂QL璇瑷鍑嗗囧繀瑕佺殑澶存枃浠跺拰搴撴枃浠躲傦级
( 2)鍒濆嫔寲Visual C++ 6.0缂栬疟鍣ㄧ幆澧冦傚湪锻戒护琛屾柟寮忎笅杩愯屾枃浠\Microsoft Visual Studio\VC98\Bin\vcvars32.bat銆
(3)鍒濆嫔寲SQL Server镄勯勭紪璇戠幆澧冦傚湪锻戒护琛屾柟寮忎笅杩愯屾枃浠:\Devtools\samples\esqlc\setenv.bat銆
( 4) VC++6.0鐜澧冮厤缃銆傚叿浣挞厤缃鍒嗕负濡备笅涓夋[锛
鈶烛ools->options->directories->Include Files:娣诲姞 C:\Program Files\Microsoft SQL Server\devtools\include銆傚皢SQL server镊甯︾殑鐢ㄤ簬鏁版嵁搴揿紑鍙戠殑澶存枃浠跺寘钖鍒板伐绋嬬幆澧冧腑銆
鈶Tools->options->directories->Lib Files:娣诲姞C:\Program Files\Microsoft SQL Server\devtools\x861ib銆傚皢寮鍙戠敤鍒扮殑鍖呭寘钖鍒板伐绋嬩腑銆
鈶project->Settings->Link->Object/Library Moles锛屾坊锷犲簱鏂囦欢:SQLakw32.lib锛 Caw32.lib銆傝繖涓や釜鏂囦欢涔嬮棿鐢ㄧ┖镙煎垎寮銆
2銆侀勭紪璇
C璇瑷缂栬疟绋嫔簭涓嶈兘璇嗗埆搴旂敤绋嫔簭涓镄凷QL璇鍙ワ纴闇瑕佺粡杩囬勫勭悊绋嫔簭灏嗗叾杞鎹㈡垚C璇鍙ャ係QL Server镄勯勫勭悊绋嫔簭鏄痭sqlprep.exe銆 nsqlprep.exe鍦⊿QL Server瀹夎呮棩褰旷殑MSSQL\Binn涓嬨傝嫢SQL Server鏁版嵁搴挞噰鐢ㄧ殑鏄榛树换瀹夎呮柟寮忥纴鍒欓渶瑕佹妸binn.rar镄勫唴瀹规嫹璐濆埌鎸囧畾鐩褰曚笅銆
Microsoft SQL Server 2000鎻愪緵镄勯勭紪璇戠▼搴弉sqlprep.exe锛岀敤浜庡瑰祵鍏ュ纺SQL绋嫔簭杩涜岄勭紪璇戝勭悊锛岀敓鎴怌璇瑷婧愮▼搴.瀹为檯涓婂氨鏄灏嗗祵鍏ュ纺SQL绋嫔簭涓镄勫祵鍏ュ纺SQL璇鍙ユ浛鎹涓哄硅繍琛屾椂搴撴枃浠禨qlakw32. dll镄勫嚱鏁拌皟鐢锛屾帴镌杩愯屾椂搴撴枃浠惰皟鐢ㄥ姩镐佽繛鎺ュ簱Ntwdblib. dll阃氲繃缃戠粶𨱒ュ瓨鍙朚icrosoft SQL Server 2000鏁版嵁搴撴湇锷″櫒.