Sql Server 2008:如何最小化存储过程的执行时间

时间:2012-12-10 08:24:34

标签: sql sql-server sql-server-2008 stored-procedures

我有Sql Server数据库,我的表有1500000行......因为数据量很大 我的后续程序的执行时间非常长

TABLE -----

CREATE TABLE [dbo].[MyTable](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Link] [text] NULL,
[Title] [text] NULL,
[Duration] [text] NULL,
[Image] [text] NULL,
[Embbed] [text] NULL,
[Keywords] [text] NULL,
[Category] [text] NULL,
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] TEXTIMAGE_ON [PRIMARY]
GO

PROCEDURE ------

ALTER PROCEDURE [dbo].[Search]
 @SearchQuery varchar(1000),
 @Id bigint
 As
BEGIN
  Select top 100 * from MyTable
  where Id > @Id and Title like '%'+@SearchQuery+'%'

任何人都可以帮助我如何最小化sql查询在1500000行表上的执行时间?

6 个答案:

答案 0 :(得分:4)

您通过以下方式强制进行表扫描:

  

标题如'%'+ @ SearchQuery +'%'

实际上没有 - 你强迫肯定不使用Title上的索引。随着索引“从左到右”,“中间的某些点”查询事物只会关闭索引使用。

如果ID留下了很多东西需要搜索 - 那么你就去了,特别是当你将它与不适当的慢速硬件结合起来时(毕竟150万是小数据)。

你要么摆脱LIKE语句中的第一个“%” - 所以可以使用一个索引 - 或者使用全文搜索,这已经打破了索引中的单词,但即便如此你最好摆脱第一个“%”。

答案 1 :(得分:3)

问题是LIKE子句中的WHERE。您正在字段中的任意位置搜索文本,这会导致Title列上可能存在的索引未被使用。

只要您需要使用LIKE搜索字段中间的字词(LIKE '%...'),就可能无法优化查询运行时。

你可以尝试做什么(即使查询引擎应该足够聪明,可以自己做):

ID > @ID条目选入临时表,然后使用TOP 100语句从该表中选择LIKE

答案 2 :(得分:0)

发布您的表格定义,这将有助于我们为您提供帮助。但是,您可以检查一些事项:

  • 确保您的表格中包含primary keyclustered index。只要它们存在,它们的定义几乎无关紧要。我建议在没有任何其他信息的情况下,Id定义它们。

  • 您真的需要从表中返回所有列吗?如果有很多列而您只需要几个,那么请明确指定它们。这将减少结果集的大小。

  • 询问用户是否真的有必要在Title上进行包含搜索。您是否可以使用搜索来启动,即删除第一个'%'?如果您可以这样做,那么Title过滤器将变为SARGable,即查询优化器将使用Title列上的索引而不是进行表扫描。您在Title上有索引吗?不是吗?

<强>更新

看过表定义后,我注意到Title的类型为text。使用表扫描搜索非常很慢,因为所有数据都存储在表行之外,必须单独提取。您可以通过将其更改为varchar类型来加快速度。相当于text的现代版本是varchar(max),因此首先尝试。但是,因为它是一个标题,你确定你真的需要在列中有2GB的字符吗?大多数东西的标题最多不超过100个字符。尝试测量所有标题的长度,看看是否可以将列的长度减少到更合理的范围。

事实上,查看所有列的名称,我无法看到任何,证明使用text是合理的。即使Link,我认为是一个网址,也不需要超过varchar(1023)

答案 3 :(得分:0)

使用VARCHAR(MAX)代替TEXT作为字段类型。

TEXT字段存储在表的其余部分的单独位置,而VARCHAR(MAX)字段与行数据一起存储,因此可以在此类型的字段上应用全文索引。

答案 4 :(得分:0)

这一个仍然开放?将文本字段更改为varchar并添加set rowcount语句后,如果需要保留主要的通配符功能,则可以在sql中完成所有操作。我经常做这类事情,没有性能问题,所以下一步是:硬件升级。

答案 5 :(得分:-1)

我会将您的LIKE语句更改为CharIndex,因为其他人已说LIKE会导致对该表进行全面扫描。

http://msdn.microsoft.com/en-us/library/ms186323.aspx向您展示如何使用CHARINDEX