• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> 数据库 >> MSSQL >> 详细内容
 

推荐文章

  • SQL数据库的备份、压缩与SQL数据库数据处理的方法
  • 压缩SQL数据库
 
 

热点文章

  • 安装SQL Server 2005实例环境图解
  • SQL数据库的备份、压缩与SQL数据库数据处理的方法
  • SQL SERVER 2005数据库镜像
  • SQL数据库还原出现错误112(磁盘空间不足)的解决办法
  • 如何使用SQL Server 2000中的XML功能
  • Server 2005性能排错
  • SQL Server 2000中的SQL语言简介
  • 在SQL Server中的关系型数据仓库分区策略
  • SQLServer删除日志方法
  • 压缩SQL数据库
  • SQL精妙语句
  • SQL Server 2000中的SQL语言简介(一)
 
 

相关文章

 
 

百度搜索

 
 

SQL Server SQL语句调优技巧

  • 阅览次数:
  • 文章来源: a hear
  • 原文作者: 不详
  • 整理日期: 2007-04-07
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

函数和表达式约束索引

当你在索引列上使用内置的函数或表达式时,优化器不能使用这些列的索引。尽量重写这些条件,在表达式中不要包含索引列。

示例

你应该帮助SQL Server移除任何在索引数值列周围的表达式。下面的查询是从表jobs通过唯一的聚集索引的唯一键值选择出的一行。如果你在这个列上使用表达式,这个索引就不起作用了。但一旦你将条件’job_id-2=0’ 该成‘job_id=2’,优化器将在聚集索引上执行seek操作。

 

下面表中列出了多种不同类型查询示例,其被禁止使用列索引,同时给出改写的方法,以获得更优的性能。

 

SET NOCOUNT ON

使用SET NOCOUNT ON 提高T-SQL代码速度的现象使SQL Server开发者和数据库系统管理者惊讶难解。你可能已经注意到成功的查询返回了关于受影响的行数的系统信息。在很多情况下,你不需要这些信息。这个SET NOCOUNT ON命令允许你禁止所有在你的会话事务中的子查询的信息,直到你发出SET NOCOUNT OFF。



这个选项不只在于其输出的装饰效果。它减少了从服务器端到客户端传递的信息量。因此,它帮助降低了网络通信量并提高了你的事务整体响应时间。传递单个信息的时间可以忽略,但考虑到这种情况,一个脚本在一个循环里执行一些查询并且发送好几千字节无用的信息给用户。

为做个例子,一个文件含T-SQL批处理,其在big_sales表插入了9999行。

-- Assumes the existence of a table called BIG_SALES, a copy of pubs..sales

SET NOCOUNT ON

DECLARE @separator VARCHAR(25),

@message VARCHAR(25),

@counter INT,

@ord_nbr VARCHAR(20),

@order_date DATETIME,

@store_nbr INT,

@qty_sold INT,

@terms VARCHAR(12),

@title CHAR(6),

@starttime DATETIME

SET @STARTTIME = GETDATE()

SELECT @counter = 0,

@separator = REPLICATE( '-', 25 )

WHILE @counter < 9999

BEGIN

SET @counter = @counter + 1

SET @ord_nbr = 'Y' + CAST(@counter AS VARCHAR(5))

SET @order_date = DATEADD(hour, (@counter * 8), 'Jan 01 1999')

SET @store_nbr =

CASE WHEN @counter < 999 THEN '6380'

WHEN @counter BETWEEN 1000 AND 2999 THEN '7066'

WHEN @counter BETWEEN 3000 AND 3999 THEN '7067'

WHEN @counter BETWEEN 4000 AND 6999 THEN '7131'

WHEN @counter BETWEEN 7000 AND 7999 THEN '7896'

WHEN @counter BETWEEN 8000 AND 9999 THEN '8042'

ELSE '6380'

END

SET @qty_sold =

CASE WHEN @counter BETWEEN 0 AND 2999 THEN 11

WHEN @counter BETWEEN 3000 AND 5999 THEN 23

ELSE 37

END

SET @terms =

CASE WHEN @counter BETWEEN 0 AND 2999 THEN 'Net 30'

WHEN @counter BETWEEN 3000 AND 5999 THEN 'Net 60'

ELSE 'On Invoice'

END

-- SET @title = (SELECT title_id FROM big_sales WHERE qty = (SELECT MAX(qty)

FROM big_sales))

SET @title =

CASE WHEN @counter < 999 THEN 'MC2222'

WHEN @counter BETWEEN 1000 AND 1999 THEN 'MC2222'

WHEN @counter BETWEEN 2000 AND 3999 THEN 'MC3026'

WHEN @counter BETWEEN 4000 AND 5999 THEN 'PS2106'

WHEN @counter BETWEEN 6000 AND 6999 THEN 'PS7777'

WHEN @counter BETWEEN 7000 AND 7999 THEN 'TC3218'

ELSE 'PS1372'

END

-- PRINT @separator

-- SELECT @message = STR( @counter, 10 ) -- + STR( SQRT( CONVERT( FLOAT,

@counter ) ), 10, 4 )

-- PRINT @message

BEGIN TRAN

INSERT INTO [pubs].[dbo].[big_sales]([stor_id], [ord_num], [ord_date],

[qty], [payterms], [title_id])

VALUES(@store_nbr, CAST(@ord_nbr AS CHAR(5)), @order_date, @qty_sold,

@terms, @title)

COMMIT TRAN

END

SET @message = CAST(DATEDIFF(ms, @starttime, GETDATE()) AS VARCHAR(20))

PRINT @message

/*

TRUNCATE table big_sales

INSERT INTO big_sales

SELECT * FROM sales

SELECT title_id, sum(qty)

FROM big_sales

group by title_id

order by sum(qty)

SELECT * FROM big_sales

*/

当带SET NOCOUNT OFF命令运行,实耗时间是5176毫秒。当带SET NOCOUNT ON命令运行,实耗时间是1620毫秒。如果不需要输出中的行数信息,考虑在每一个存储过程和脚本开始时增加SET NOCOUNT ON 命令将。

[1] [2] [3] [4]

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号