案例 1 - 在 where 子句中使用 OR 运算符的单个查询:
select * from users where name='smith' or nick='smith' (using index_merge )
Run Code Online (Sandbox Code Playgroud)
案例 2 - 在 where 子句中使用 equals 运算符的多个查询:
select * from users where name='smith'; (using single index);
select * from users where nick='smith'; (using single index);
Run Code Online (Sandbox Code Playgroud)
问:在案例 2 中是否有任何性能损失?
我们有一个InventoryActivity
表,用于保存项目数量的交易变化:
CREATE TABLE dbo.InventoryActivity(
InventoryActivity_uid int IDENTITY(1,1) NOT NULL PRIMARY KEY,
Organization_uid int NOT NULL,
MasterInventory_uid int NOT NULL,
AdjustmentType_cd varchar(20) NULL,
AdjustmentReason_cd varchar(20) NULL,
Quantity int NULL
)
Run Code Online (Sandbox Code Playgroud)
我们想要一个InventorySummary
应该聚合到每个的当前数量。汇总计数应该始终可以从交易记录的总和中推导出来,但是我们有几种不同的方法来计算汇总计数:
哪些性能考虑因素应该使天平有利于特定策略?
存在哪些最佳实践? *(我知道最佳实践接近于讨论,但我想知道哪些考虑会有助于做出决定)
存储过程
最简单的选择是每次都执行新鲜的 SUM 操作。但不涉及缓存,随着时间的推移可能会导致性能问题。
CREATE PROCEDURE dbo.GetInventorySummary
AS
SELECT Organization_uid,
MasterInventory_uid,
SUM(Quantity) AS Quantity
FROM dbo.InventoryActivity
GROUP BY Organization_uid, MasterInventory_uid
Run Code Online (Sandbox Code Playgroud)单独的表
我们可以创建一个表来存储当前数量。好的一面是获取这些数据是微不足道的。缺点是我们每次写入 InventoryActivity 表时都必须手动维护它并保持记录同步。
CREATE TABLE dbo.InventorySummary(
Organization_uid int NOT NULL,
MasterInventory_uid int NOT NULL,
Quantity int NOT NULL, …
Run Code Online (Sandbox Code Playgroud)