Sql server 使用Except子句选择count花费的时间太长

Sql server 使用Except子句选择count花费的时间太长,sql-server,Sql Server,我正在执行两个查询。一个返回记录数,另一个获取结果。但对于只需要记录总数的查询,它所用的时间与获取结果的查询所用的时间相同。为什么?这是我的SQL。我正在使用SQL 2014: (SELECT count(*) as id FROM ( SELECT DISTINCT title, version FROM book AS b WHERE b.title IS NOT NULL AND NOT EXISTS (SELECT * FR

我正在执行两个查询。一个返回记录数,另一个获取结果。但对于只需要记录总数的查询,它所用的时间与获取结果的查询所用的时间相同。为什么?这是我的SQL。我正在使用SQL 2014:

(SELECT count(*) as id
        FROM (
        SELECT DISTINCT title, version
        FROM book AS b
        WHERE b.title IS NOT NULL AND NOT EXISTS (SELECT * FROM user AS u WHERE u.column1 = b.column1)
        group by title, version
        EXCEPT
        SELECT DISTINCT title, version
        FROM book AS b
        WHERE b.title IS NOT NULL AND EXISTS (SELECT * FROM user AS u WHERE u.column2 = b.column1)
        group by title, version
    ) c ) 
试试这个:

(SELECT count(*) as id
        FROM (
        SELECT DISTINCT title, version
        FROM book  b left join user u on b.column1=u.column1
        WHERE b.title IS NOT NULL and u.column1 is null
        EXCEPT
        SELECT DISTINCT title, version
        FROM book b join user u on b.column1=u.column2
        WHERE b.title IS NOT NULL  
    ) c ) 

嗯。为了提高性能,请尝试按删除
组,然后选择distinct
除外
仍会执行此操作):

下一步:确保在
user(column2)
user(column1)
上有索引


有了关于数据的更多信息,就有可能提出进一步的建议。

可以从
sql版本开始,然后再从实际问题开始。。。您的查询无法帮助我们了解您想要的是什么?我假设您的意思是“除外”条款?是的,它是“除外”条款。标题中的一个错误是:首先删除子查询,然后替换为左联接-这应该会加快速度。我认为问题不在于联接或子查询。更多的是计数语法,我试图找出如何修复它。即使使用计数,它仍然会获取每一行,因此当我单独执行查询时,problemsubquery总是会减慢速度,它们在不到1秒的时间内执行。第一个查询返回450条记录,第二个查询返回40条记录。最后,我应该有410张唱片。因此,我认为问题来自EXPECT子句,因为它需要15秒才能完成!哦,好的,我明白了-你有没有尝试过用另一个命令来替换?类似于“where title not in”或左键连接到第二个查询等,id列具有主键并被索引。我需要为第1列和第2列添加什么类型的索引?列存储索引还是索引?我为第1列和第2列添加了索引,现在查询在6秒后执行,而不是14秒:),但计数也在6秒后执行,与我获取所有行时相同!通常计数应该更快不?当我分别执行两个子查询时,两个子查询都在不到1秒的时间内执行!也许我会创建一个函数,输出两个查询的计数增量!
SELECT count(*) as id
FROM (SELECT title, version
      FROM book b
      WHERE b.title IS NOT NULL AND NOT EXISTS (SELECT 1 FROM user u WHERE u.column1 = b.column1)
      EXCEPT
      SELECT title, version
      FROM book b
      WHERE b.title IS NOT NULL AND EXISTS (SELECT 1 FROM user u WHERE u.column2 = b.column1)
    ) c;