我有一个SQL Server数据库,并且有一个包含太多记录的表。在它正常工作之前,但现在我运行SQL语句需要时间来执行。 有时会导致SQL数据库使用过多的CPU。 这是表的查询。
CREATE TABLE [dbo].[tblPAnswer1](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[AttrID] [int] NULL,
[Kidato] [int] NULL,
[Wav] [int] NULL,
[Was] [int] NULL,
[ShuleID] [int] NULL,
[Mwaka] [int] NULL,
[Swali] [float] NULL,
[Wilaya] [int] NULL,
CONSTRAINT [PK_tblPAnswer1] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
以下是该语句的sql存储过程。
ALTER PROC [dbo].[uspGetPAnswer1](@ShuleID int, @Mwaka int, @Swali float, @Wilaya int)
as
SELECT ID,
AttrID,
Kidato,
Wav,
Was,
ShuleID,
Mwaka,
Swali,
Wilaya
FROM dbo.tblPAnswer1
WHERE [ShuleID] = @ShuleID
AND [Mwaka] = @Mwaka
AND [Swali] = @Swali
AND Wilaya = @Wilaya
我的SQL语句有什么问题。需要帮助。
答案 0 :(得分:1)
只需在ShuleID,Mwaka,Swali和Wilaya列上添加索引即可。索引中列的顺序应取决于数据的分布(其中具有最多不同值的列应该是索引中的第一个,依此类推)。
如果您需要超快速,也包括查询中使用的所有剩余列,则为此特定查询提供覆盖索引。
编辑:可能应该将float col(Swali)从索引列移动到包含的列。
答案 1 :(得分:0)
在ID
列上添加索引,并添加ShuleID
,Mwaka
,Swali
和Wilaya
列。这应该有助于提高查询的速度。
CREATE NONCLUSTERED INDEX IX_ID_ShuleID_Mwaka_Swali_Wilaya
ON tblPAnswer1 (ID)
INCLUDE (ShuleID, Mwaka, Swali, Wilaya);
答案 2 :(得分:0)
桌子的大小是多少?您可能需要其他索引,因为您没有使用主键来查询数据。 Pinal Dave的这篇文章提供了一个识别缺失索引的脚本。
http://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/
它为索引优化提供了一个很好的起点。