我有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行表上的执行时间?
答案 0 :(得分:4)
您通过以下方式强制进行表扫描:
标题如'%'+ @ SearchQuery +'%'
实际上没有 - 你强迫肯定不使用Title上的索引。随着索引“从左到右”,“中间的某些点”查询事物只会关闭索引使用。
如果ID留下了很多东西需要搜索 - 那么你就去了,特别是当你将它与不适当的慢速硬件结合起来时(毕竟150万是小数据)。
你要么摆脱LIKE语句中的第一个“%” - 所以可以使用一个索引 - 或者使用全文搜索,这已经打破了索引中的单词,但即便如此你最好摆脱第一个“%”。
答案 1 :(得分:3)
问题是LIKE
子句中的WHERE
。您正在字段中的任意位置搜索文本,这会导致Title
列上可能存在的索引未被使用。
只要您需要使用LIKE
搜索字段中间的字词(LIKE '%...'
),就可能无法优化查询运行时。
你可以尝试做什么(即使查询引擎应该足够聪明,可以自己做):
将ID > @ID
条目选入临时表,然后使用TOP 100
语句从该表中选择LIKE
。
答案 2 :(得分:0)
发布您的表格定义,这将有助于我们为您提供帮助。但是,您可以检查一些事项:
确保您的表格中包含primary key
和clustered 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