【问题标题】:Best way to select nonclustered index on SQL Server 2014在 SQL Server 2014 上选择非聚集索引的最佳方法
【发布时间】:2019-07-25 17:50:20
【问题描述】:

我是开发人员,而不是 DBA。但在我当前的项目中,我面临两种查询类型的 SQL 查询性能问题,即 CPU 和内存消耗。我不能在这里分享我的实际表结构,但我们可以在下面考虑几乎相同的结构。

ProductTbl

ProductId BIGINT
CustomerId BIGINT
ProductCode NVARCHAR(50)
ProductName NVARCHAR(250)
ProductImage NVARCHAR(250)
IsDeleted BIT
IsActive BIT

OrderTbl

OrderId BIGINT
CustomerId BIGINT
ProductCode NVARCHAR(50)
OrderDate DATETIME2(7)
Quantity INT

我们无法在OrderTbl 中添加ProductId,因为我们正在接收来自第三方的订单详细信息,我们可能会得到不在ProductTbl 中的ProductCode(或者可以添加到或删除) ProductTbl 随时)。

以下是一些示例查询

SELECT
    ProductId,  
    CustomerId, ProductCode, ProductName, ProductImage
FROM 
    ProductTbl
WHERE 
    CustomerId = @CustomerId 
    AND ProductCode = @ProductCode  
    AND IsDeleted = 0 
    AND IsActive = 1

SELECT
    CustomerId, ProductCode, ProductName, ProductImage
FROM 
    ProductTbl pt
LEFT OUTER JOIN 
    OrderTbl ot ON pt.ProductCode = ot.ProductCode
WHERE 
    pt.CustomerId = @CustomerId 
    AND pt.ProductCode = @ProductCode 
    AND pt.IsDeleted = 0 
    AND pt.IsActive = 1
    AND OrderDate BETWEEN DATEADD(DAY, -15, GETDATE()) AND GETDATE()

现在,我有几个像下面这样的问题

  1. 我应该在单独的列上创建一个非聚集索引,还是应该在一个索引中使用多个列?

  2. 在多列上创建非聚集索引时,顺序是否重要?

谢谢

【问题讨论】:

  • 您是在问如何或是否应该创建索引,还是想知道如何让您的查询使用非聚集索引?您的问题标题和帖子末尾的问题不同步。
  • 感谢@Eli 的快速回复。托管人员告诉我应用索引,甚至我也应用了一些非常直接的索引,比如 ProductTbl 上的 CustomerId asc 并且在过去的几个月里它运行良好。但数据是增加客户数量的原因。我几乎完成了 100 个存储过程,现在我只想设置索引,以便我的存储过程可以按预期工作。
  • 广义上讲,当您将更多数据放入表中时,您需要为查询建立更精确的索引。是的,当使用多个列时,列的顺序可能很重要 - 首先选择最具选择性的直接查找列(即 WHERE 列 = 值)是您最快的选择。

标签: sql-server database-administration


【解决方案1】:

使用您的编号格式:

  1. 您应该为您的查询创建最少但覆盖索引。这些索引应包含存储过程所需的所有列。如果这将使索引可用于多个存储过程,请尝试添加更多列。更多索引 = 为该表上的每个插入/修改写入更多的数据库 - 您可能需要牢记这一点,而不是创建大量索引

  2. 顺序很重要——你敢打赌!

这是来自世界级 DBA 的视频,它解释了我提到的 2 点,并解释了幕后发生的事情。我发现这些信息在索引调优中非常宝贵。 https://www.brentozar.com/archive/2019/01/how-to-think-like-the-engine-2019-edition/

【讨论】:

    【解决方案2】:

    Here 是我作为普通开发人员从事索引设计工作时经常使用的一篇很有帮助的文章。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2012-10-01
      • 2018-05-08
      • 2011-05-03
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多