我在表格中收集了电子表格的每个单元格。
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秒。
是否有明显更好/更快的方法来获得相同的结果?
答案 0 :(得分:1)
每当您在开头使用带通配符的LIKE查询时,例如示例中的'%starting balance%'
,就会破坏优化器使用任何索引来加速查询的能力。因此,如果您可以确信您要查找的单元格将以“起始余额”开头,那么您可以删除第一个通配符并使用value
列上的任何索引。
说到索引,您可以尝试创建一些。我不是专家,但我会在value
上尝试一个,并在连接条件(DocumentName
,SheetName
和RowNumber
中的其他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%'