首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2008 R2:调优查询

Server 2008 R2:调优查询
EN

Stack Overflow用户
提问于 2015-07-27 10:34:49
回答 1查看 85关注 0票数 1

我有下表,有10亿份记录。

代码语言:javascript
复制
create table PfTest
(
    cola int,
    colb int,
    colc date,
    cold varchar(10),
    ID int
);

现在我想显示的记录是在一个特定的日期,而不是在特定的日期。

对于这些查询,我使用了以下两种类型的查询:

查询1:

代码语言:javascript
复制
select DISTINCT cola, colb, colc, cold, ID
from PfTest
WHERE colc In ('2014-01-01') 
  AND cold NOT IN (SELECT cold 
                   FROM PfTest 
                   WHERE ID = 1 
                     AND colc IN ('2014-01-02', '2014-01-03', 
                                  '2014-01-04', '2014-01-05', '2014-01-06'));

查询2:

代码语言:javascript
复制
WITH cte AS
(
    SELECT DISTINCT cola, colb, colc, cold, ID
    FROM PfTest
    WHERE cold NOT IN (SELECT cold FROM PfTest 
                       WHERE ID = 1 
                         AND colc IN('2014-01-02', '2014-01-03',
                                     '2014-01-04', '2014-01-05', '2014-01-06'))
) 
SELECT cola, colb, colc, cold, ID
FROM cte 
WHERE colc IN ('2014-01-01');   

以上两个查询计划在执行时都是相同的。两个人都花了很长时间来执行死刑。我能为这种情况写一些更好的查询吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-27 10:53:13

这是您的查询,没有DISTINCT (这似乎是不必要的):

代码语言:javascript
复制
select cola, colb, colc, cold, ID
from PfTest
WHERE colc In ('2014-01-01') AND 
      cold NOT IN (SELECT cold
                   from PfTest
                   WHERE ID = 1 AND
                         colc IN ('2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05', '2014-01-06')
                  );

我会从索引开始。PFTest(colc, cold)PFTest(id, colc, cold).

如果子查询返回大量数据--比如数百万行--那么使用临时表可能会更好。我会先试试这个指数。如果这样做不起作用,在cold上设置索引的临时表可能会工作。另外,尽管它对性能的影响很小,但我会使用NOT EXISTS而不是NOT IN来表示查询。

代码语言:javascript
复制
select cola, colb, colc, cold, ID
from PfTest t
WHERE colc In ('2014-01-01') AND 
      NOT EXISTS (SELECT 1
                  from PfTest t2
                  WHERE t2.cold = t1.cold AND t2.ID = 1 AND
                        t2.colc IN ('2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05', '2014-01-06')
                 );

对于这个版本,最好的索引是PfTest(cold, id, colc)

当匹配的列具有NULL值时,NULL具有更直观的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31650848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档