【发布时间】:2018-04-19 15:29:00
【问题描述】:
有谁知道另一种更有效地运行下面的查询的方法?我正在使用 SQL Server 2014。
SELECT
(SELECT
COUNT(1) VolumeTransacaoBoleto
FROM
TableA WITH (NOLOCK)--orders WITH(NOLOCK)
WHERE
TIT_DATA_EMISSAO BETWEEN '2017-05-01' AND '2017-05-02'
) Amount1,
(SELECT COUNT(*) VolumeRegistro
FROM TableB WITH (NOLOCK)
WHERE payment_type IN (300, -1)
AND data BETWEEN '2017-05-01' AND '2017-05-02') Amount2
我知道使用子查询并不是最好的方法。我想按列分别显示所有计数。
这是执行计划,之后我像@Ezlo所说的那样在TableB上创建了一个索引
【问题讨论】:
-
架构/索引信息会很有用
-
由于您对日期进行了过滤,您可以在两个表的日期列上定义分区。这将有助于提高性能。
-
好的,我会把所有的证据都放在这里。关于结构..可以做子查询吗?
-
@GauravS 不,不会的。分区并不是为了提高查询性能,事实上它们通常损害它。重要的是索引
-
@Luiz 忘记证据。发布表架构、索引和执行计划。也删除
NOLOCK提示。它们的意思是“在获取大锁的同时读取脏数据”。如果您觉得有必要添加它们,则意味着您正试图从其他人使用的表中读取太多数据
标签: sql sql-server performance select