我有一个相对较大的表(目前有300万条记录)。其中有专栏:
[id] INT IDENTITY(1,1) NOT NULL,
[runId] INT NOT NULL,
[request] VARCHAR(MAX) NULL,
[response] VARCHAR(MAX) NULL
索引为:CONSTRAINT [Id_Indexed] PRIMARY KEY CLUSTERED
我对此表有所了解。
当我查询时:
Query 1 on table -- SELECT COUNT(*) FROM API (nolock) WHERE runId = 22
Query 2 on view -- SELECT COUNT(*) FROM API_View WHERE runId = 22
然后我会得到大约100万的结果,但是查询1花了16分钟,而查询2花了18分钟。
有可能改善这一点吗?
答案 0 :(得分:2)
正如人们已经提到的那样,使用为列运行id添加一个索引。
根据表格的使用方式,您可以考虑使用" with(nolock)" -hint。在某些情况下,它可以大大提高性能。请阅读此处以获取更多信息:
https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/
另一个建议(但不是关于你的性能问题):检查你是否真的需要varchar(max),通常varchar(255)更适合。 varchar(max)在磁盘上占用更多空间。
答案 1 :(得分:0)
CREATE VIEW dbo.API_View
WITH SCHEMABINDING
AS
SELECT runId, cnt = COUNT_BIG(*)
FROM dbo.API
GROUP BY runId
GO
CREATE CLUSTERED INDEX ix ON dbo.API_View (runId)
GO
SELECT cnt
FROM dbo.API_View WITH(NOEXPAND)
WHERE runId = 22
或
CREATE NONCLUSTERED INDEX ix ON dbo.API (runId)
GO
SELECT COUNT_BIG(*)
FROM API --WITH(INDEX(ix))
WHERE runId = 22
或
EXEC sp_tableoption 'dbo.API', 'large value types out of row', 1;
答案 2 :(得分:0)
确定,
CREATE NONCLUSTERED INDEX [IX_Table_RunId] ON [Table]([RunId]);
再次运行查询。