如何提高比较大的表的性能

时间:2016-05-18 08:27:20

标签: sql sql-server sql-server-2014

我有一个相对较大的表(目前有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分钟。

有可能改善这一点吗?

3 个答案:

答案 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]);

再次运行查询。