计数与多列不同需要很长时间

时间:2016-09-13 08:13:01

标签: sql-server tsql

我试图通过两个字段在SQL服务器中执行count distinct。

我尝试了两种不同的方式。 第一个是串联:

select count (distinct CONCAT ([UCID],[CALLSEGMENT]))
 from IVR_LINES
where UCID in (select UCID
from [EPMTest].[dbo].[IVR_LINES]
where MODULE = 'hozlap' and EVENT_NAME = 'A3' and EVENT_VALUE in ('1','2','3') and DATE> 20160911)
and EVENT_NAME = 'A6' or  EVENT_NAME = 'A7'

虽然第二个是使用子查询:

select COUNT(*) from(
select distinct UCID,CALLSEGMENT
 from IVR_LINES
where UCID in (select UCID
from [EPMTest].[dbo].[IVR_LINES]
where MODULE = 'hozlap' and EVENT_NAME = 'A3' and EVENT_VALUE in ('1','2','3') and DATE> 20160911)
and EVENT_NAME = 'A6' or  EVENT_NAME = 'A7'
)a

它们需要大约相同的运行时间(超过10秒,可能是由于内部查询本身)。  但是,我想知道 - 哪一个更有效率?我应该选择哪种方法?

由于

2 个答案:

答案 0 :(得分:1)

请发布您的执行计划,以找到确切的时间。同时你可以用这样的exists子句重写你的查询。

SELECT COUNT(*)
FROM (
    SELECT DISTINCT UCID
        ,CALLSEGMENT
    FROM IVR_LINES IL
    WHERE EXISTS (
            SELECT 1
            FROM [EPMTest].[dbo].[IVR_LINES]
            WHERE MODULE = 'hozlap'
                AND EVENT_NAME = 'A3'
                AND EVENT_VALUE IN (
                    '1'
                    ,'2'
                    ,'3'
                    )
                AND UCID = IL.UCID
                AND DATE > 20160911
            )
        AND EVENT_NAME IN (
            'A6'
            ,'A7'
            )
    ) A

答案 1 :(得分:0)

我认为您的查询有问题

首先and EVENT_NAME = 'A6' or EVENT_NAME = 'A7'会出错, 尝试将其替换为and (EVENT_NAME = 'A6' or EVENT_NAME = 'A7')

id=reports
非常By.id("reports")

不同

使用您的语法,查询将比(我认为)预期的记录多得多,这可能是执行时间慢的问题

谈论哪个是最好的...它们对于优化器几乎是相同的

你应该添加一些关于主键,索引,记录数和一些数据示例的信息。