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