我试图通过两个字段在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秒,可能是由于内部查询本身)。 但是,我想知道 - 哪一个更有效率?我应该选择哪种方法?
由于
答案 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")
使用您的语法,查询将比(我认为)预期的记录多得多,这可能是执行时间慢的问题
谈论哪个是最好的...它们对于优化器几乎是相同的
你应该添加一些关于主键,索引,记录数和一些数据示例的信息。