两张表
T_3G_TEST(PRD_INST_ID,BYTES_3G) PRD_INST_ID上聚簇索引
T_QD_HLF(PRD_INST_ID,AREA_NAME,...) PRD_INST_ID上聚簇索引、AREA_NAME上非聚簇索引
两张表都有500W左右数据,想要对AREA_NAME为'ZL'的PRD_INST_ID对应的BYTES_3G进行求和,三种做法执行计划完全一样,我表示不理解。 第1种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a ,
dbo.T_QDHLF b
WHERE a.PRD_INST_ID = b.PRD_INST_ID
AND b.AREA_NAME = 'ZL'
第2种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a
WHERE EXISTS ( SELECT 1
FROM T_QDHLF b
WHERE a.PRD_INST_ID = b.PRD_INST_ID
AND b.AREA_NAME = 'ZL' )
第3种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a
WHERE PRD_INST_ID IN ( SELECT PRD_INST_ID
FROM T_QDHLF b
WHERE b.AREA_NAME = 'ZL' )
T_3G_TEST(PRD_INST_ID,BYTES_3G) PRD_INST_ID上聚簇索引
T_QD_HLF(PRD_INST_ID,AREA_NAME,...) PRD_INST_ID上聚簇索引、AREA_NAME上非聚簇索引
两张表都有500W左右数据,想要对AREA_NAME为'ZL'的PRD_INST_ID对应的BYTES_3G进行求和,三种做法执行计划完全一样,我表示不理解。 第1种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a ,
dbo.T_QDHLF b
WHERE a.PRD_INST_ID = b.PRD_INST_ID
AND b.AREA_NAME = 'ZL'
第2种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a
WHERE EXISTS ( SELECT 1
FROM T_QDHLF b
WHERE a.PRD_INST_ID = b.PRD_INST_ID
AND b.AREA_NAME = 'ZL' )
第3种:
SELECT SUM(a.BYTES_3G)
FROM dbo.T_3G_TEST a
WHERE PRD_INST_ID IN ( SELECT PRD_INST_ID
FROM T_QDHLF b
WHERE b.AREA_NAME = 'ZL' )
SELECT PRD_INST_ID into #B
FROM T_QDHLF b
WHERE b.AREA_NAME = 'ZL'
主要是你的where 条件不复杂
而且返回的结果也只有一个聚合值所以对三个语句优化后的方案都是一样的。