【问题标题】:SELECT - Performance选择 - 性能
【发布时间】: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


【解决方案1】:

为您的查询创建 2 个特定索引,如下所示:

CREATE NONCLUSTERED INDEX TableAIndex ON TableA (TIT_DATA_EMISSAO)

CREATE NONCLUSTERED INDEX TableBIndex ON TableB (payment_type, data)

如果你可以让它们CLUSTERED 更好(你必须先删除已经存在的聚集索引,或者如果它也是聚集的,则删除主键)。

还要确保TIT_DATA_EMISSAOdataDATEDATETIME 数据类型。

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2014-02-03
    • 2014-08-19
    • 2012-01-31
    • 2010-11-27
    • 2011-06-23
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多