SQL语句需要很长时间才能执行

时间:2015-03-24 08:38:59

标签: sql sql-server

我有一个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语句有什么问题。需要帮助。

3 个答案:

答案 0 :(得分:1)

只需在ShuleID,Mwaka,Swali和Wilaya列上添加索引即可。索引中列的顺序应取决于数据的分布(其中具有最多不同值的列应该是索引中的第一个,依此类推)。

如果您需要超快速,也包括查询中使用的所有剩余列,则为此特定查询提供覆盖索引。

编辑:可能应该将float col(Swali)从索引列移动到包含的列。

答案 1 :(得分:0)

ID列上添加索引,并添加ShuleIDMwakaSwaliWilaya列。这应该有助于提高查询的速度。

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/

它为索引优化提供了一个很好的起点。