1

我有 Sql Server 数据库,我的表有 1500000 行......因为我的以下过程的大量数据执行时间非常高

桌子 - - -

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

程序 - - -

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

谁能帮助我如何最小化 1500000 行表上的 sql 查询的执行时间?

4

6 回答 6

4

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

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

实际上没有 - 你绝对强制不使用标题上的索引。当索引“从左到右”时,“中间的某个点”查询只会关闭索引的使用。

如果 ID 有很多要搜索的内容 - 就可以了,尤其是当您将其与不适当的慢速硬件结合使用时(毕竟 150 万是小数据)。

你要么去掉 LIKE 语句中的第一个“%”——所以可以使用索引——或者使用全文搜索,这已经分解了索引中的单词,但即使这样你最好去掉第一个“ %”。

于 2012-12-10T08:37:13.393 回答
3

问题出LIKEWHERE子句中。您正在字段内的任何位置搜索文本,这会导致Title未使用列上可能存在的索引。

只要您需要使用LIKE字段( )中间的术语进行搜索LIKE '%...',就可能没有机会优化查询运行时。

您可以尝试做的事情(即使查询引擎本身应该足够聪明)是:

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

于 2012-12-10T08:29:27.240 回答
0

使用VARCHAR(MAX)而不是TEXT作为字段类型。

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

于 2012-12-10T11:29:15.503 回答
0

发布您的表定义,这将有助于我们为您提供帮助。但是,您可以检查以下几点:

  • 确保您的表有 aprimary key和 a clustered index。只要它们存在,它们的定义几乎无关紧要。我建议Id在没有任何其他信息的情况下定义它们。

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

  • 询问用户是否真的需要Title. 您可以先从搜索开始,即删除第一个'%'吗?如果你能做到这一点,那么Title过滤器就变成了 SARGable,即查询优化器将使用Title列上的索引而不是进行表扫描。你有一个索引,Title不是吗?

更新:

看过表定义后,我注意到它Title有 type text。使用表扫描进行搜索非常慢,因为所有数据都存储在表行之外并且必须单独获取。varchar您可以通过将其更改为类型来加快速度。现代等价于textis varchar(max),所以先试试吧。但是,既然是标题,那么您确定列中真的需要 2GB 的字符吗?大多数事物的标题最多不超过 100 个字符。尝试测量所有标题的长度,看看是否可以将列的长度缩短到更合理的程度。

实际上,查看您所有列的名称,我看不到任何可以证明使用text. 甚至Link,我认为它是一个 URL,不需要超过varchar(1023).

于 2012-12-10T08:36:53.797 回答
0

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

于 2013-06-06T19:38:29.557 回答
-1

我会将您的LIKE声明更改CharIndex为其他人所说的那样,这LIKE将导致对表进行全面扫描。

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

于 2012-12-10T10:27:38.640 回答