Sql 选择-性能
有人知道另一种更有效地运行下面的查询的方法吗?我正在使用SQL Server 2014Sql 选择-性能,sql,sql-server,performance,select,Sql,Sql Server,Performance,Select,有人知道另一种更有效地运行下面的查询的方法吗?我正在使用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' ) A
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
我知道使用子查询并不是最好的方法。我想按列分别显示所有计数
这是执行计划,之后我在TableB
上创建了一个索引,就像@Ezlo所说的那样
为查询创建两个特定索引,如下所示:
CREATE NONCLUSTERED INDEX TableAIndex ON TableA (TIT_DATA_EMISSAO)
CREATE NONCLUSTERED INDEX TableBIndex ON TableB (payment_type, data)
如果您可以将它们聚集起来,那么就更好了(您必须先删除已经存在的聚集索引,如果它也是聚集的,则必须删除主键)
还要确保TIT_DATA_EMISSAO
和DATA
是DATE
或DATETIME
数据类型。架构/索引信息会很有用,因为您有日期过滤器,所以您可以在两个表的DATE列上定义分区。这将有助于提高性能。好的,我将在这里发布所有证据。关于结构。。可以做子查询吗?@GauravS不可以。分区并不是为了提高查询性能,事实上它们通常会损害查询性能。索引才是最重要的important@Luiz忘了证据吧。发布表模式、索引和执行计划。同时删除NOLOCK
提示。他们的意思是“在使用大锁时读取脏数据”。如果您觉得需要添加它们,则意味着您试图从其他人使用的表中读取太多数据