可以更快地查询搜索电子表格单元格数据库的查询吗?

时间:2011-12-08 02:12:10

标签: query-optimization sql-server-2008-r2

我在表格中收集了电子表格的每个单元格。

CREATE TABLE [dbo].[SheetRow](
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [DocumentName] [varchar](max) NULL,
    [SheetName] [varchar](max) NULL,
    [RowNumber] [varchar](max) NULL,
    [ColumnNumber] [varchar](max) NULL,
    [Value] [varchar](max) NULL)

查询以查找值与特定字符串匹配的所有单元格行:

select *
from sheetrow a 
inner join sheetrow b
on
    a.value like '%starting balance%' and
    a.DocumentName=b.DocumentName and
    a.SheetName=b.SheetName and
    a.RowNumber=b.RowNumber

表中有34K个单元格(行),查询耗时41秒。

是否有明显更好/更快的方法来获得相同的结果?

2 个答案:

答案 0 :(得分:1)

每当您在开头使用带通配符的LIKE查询时,例如示例中的'%starting balance%',就会破坏优化器使用任何索引来加速查询的能力。因此,如果您可以确信您要查找的单元格将以“起始余额”开头,那么您可以删除第一个通配符并使用value列上的任何索引。

说到索引,您可以尝试创建一些。我不是专家,但我会在value上尝试一个,并在连接条件(DocumentNameSheetNameRowNumber中的其他3列中尝试一个)用。

在尝试确定查询速度慢的原因时,第一步是运行SQL:

SET IO STATISTICS ON
GO
在您正在使用的查询窗口中

,然后运行您的查询。在运行查询之前,还要启用“实际执行计划”。查询运行后,您将能够在“消息”选项卡中查看详细的统计信息,并且您希望查找具有非常高的逻辑读取,物理读取或扫描计数的表。然后查看执行计划中是否有昂贵的操作使用这些表,并查看是否有办法可以提高该操作的效率。

尝试查找查询速度缓慢的最后一个提示:安装并使用免费的SQL Sentry Plan Explorer工具,以获得更详细,更有帮助的执行计划视图。你会发现 sooo 比SSMS中的默认执行计划查看器更有帮助。

答案 1 :(得分:0)

不要以为我明白你要做什么。为什么你需要让一个sheetrow加入另一个?不能只是:

select *
from sheetrow a 
where a.value like '%starting balance%'