查询优化 sql

原创 2006年06月15日 13:29:00

 

查询1:
DECLARE @d datetime
SET @d = getdate()
SELECT top 1000 * FROM product WHERE CONTAINS(name,'男上装') OR CONTAINS(text,'男上装')
SELECT datediff(ms,@d,getdate())
SET @d = getdate()
SELECT * FROM product WHERE CONTAINS(name,'男上装') OR CONTAINS(text,'男上装')
SELECT datediff(ms,@d,getdate())

结果1:(总数:14条)
14条数据用时3610(这是使用了top 1000后)
14条数据用时266  (这是没有使用top 1000的)

查询2:
DECLARE @d datetime
SET @d = getdate()
SELECT top 1000 * FROM product WHERE CONTAINS(name,'公司') OR CONTAINS(text,'公司')
SELECT datediff(ms,@d,getdate())
SET @d = getdate()
SELECT * FROM product WHERE CONTAINS(name,'公司') OR CONTAINS(text,'公司')
SELECT datediff(ms,@d,getdate())

结果2:(总数:165949条)
1000条数据用时4233(这是用了top 1000后)
165949条数据用时8330(这是没用top 1000后)

 

 

楼主的查询使用了 OR 条件, 这个查询大致上会这样生成这样的执行计划:
1. 执行两句:
SELECT top 1000 * FROM product WHERE CONTAINS(name,'男上装')
SELECT top 1000 * FROM product WHERE CONTAINS(text,'男上装')
2. 对结果做一个join

这样就涉及取两表join联接的算法了
有top 的情况下, 一般使用的是嵌套循环, 没有top的情况下, 多半使用的是哈希联接

嵌套循环使用的搜索方法是:
将一个联接输入用作外部输入表(显示为图形执行计划中的顶端输入),将另一个联接输入用作内部(底端)输入表。外部循环逐行处理外部输入表。内部循环会针对每个外部行执行,在内部输入表中搜索匹配行。

很显然, 如果匹配的数据很少的话(准确地说匹配的数据在扫描顺序的尾部, 匹配的数据越少, 发生这种情况的可能性越高), 那么扫描势必会遍历完整个表, 这样的效率显然不高.
而哈希联接不存在这种问题

所以你会发觉, 匹配的数据量少的情况下, TOP 的执行效率反而低.

 

 

OPTION 子句
指定应在整个查询中使用所指定的查询提示。每个查询提示只能指定一次,但允许指定多个查询提示。用该语句只可能指定一个 OPTION 子句。查询提示影响语句中的所有运算符。如果主查询中涉及 UNION,则只有涉及 UNION 运算符的最后一个查询可以有 OPTION 子句。如果一个或多个查询提示导致查询优化器不生成有效计划,则产生 8622 错误。

 

注意  由于查询优化器通常为查询选择最优执行计划,所以建议只把 <join_hint>, <query_hint> 和 <table_hint> 作为经验丰富的数据库管理员的最终手段。


语法
[ OPTION ( < query_hint > [ ,...n ] ) ]

< query_hint > ::=
    {    { HASH | ORDER } GROUP
    | { CONCAT | HASH | MERGE } UNION
    | { LOOP | MERGE | HASH } JOIN
    | FAST number_rows
    | FORCE ORDER
    | MAXDOP number
    | ROBUST PLAN
    | KEEP PLAN
    | KEEPFIXED PLAN
    | EXPAND VIEWS
    }

 

 

相关文章推荐

SQL查询优化

  • 2014年03月21日 16:00
  • 41KB
  • 下载

SQL查询优化

  • 2015年10月14日 11:11
  • 2.41MB
  • 下载

【sql查询与优化】4.删除插入与更新

注:以下所有sql案例均取自"oracle查询优化改写技巧与案例"丛书。 案例中可能会用到的表: EMP表的详细: 查询所有信息, SQL> select * from emp;      EM...

informix数据库sql查询优化

  • 2010年08月25日 17:47
  • 1.38MB
  • 下载

2. SQL 语句本身的优化(慢查询)

MySQL客户端连接成功后,通过使用show [session|global] status 命令可以提供服务器状态信息。其中的session来表示当前的连接的统计结果,global来表示自数据库上次...
  • enlyhua
  • enlyhua
  • 2016年04月03日 14:08
  • 2030

SQL Server 2008查询性能优化(4)

  • 2011年03月08日 15:34
  • 13.9MB
  • 下载

优化sql查询速度

  • 2012年07月31日 15:09
  • 17KB
  • 下载

库存产品日期查询功能sql优化

那年,我负责维护一家食品企业的一个内部销售管理系统。在经销商库存管理模块,有经销商库存产品生产日期管理功能, 如下是登记页面, 业务描述为,根据当天对经销商的产品库存的盘点,记录各产品在不同生产日期的...
  • gzyes
  • gzyes
  • 2014年03月24日 19:40
  • 733

SQL查询语句的性能优化

  • 2013年11月29日 12:59
  • 165KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查询优化 sql
举报原因:
原因补充:

(最多只允许输入30个字)