Sql server 2005 构建一个汇总另一个表数据的表-优化建议?
我试图建立一个表,总结我们维基中的页面引用某些宏的次数 我构建了一个名为@currentpages的临时表,其中包含55k行,如下所示:Sql server 2005 构建一个汇总另一个表数据的表-优化建议?,sql-server-2005,tsql,sql-optimization,Sql Server 2005,Tsql,Sql Optimization,我试图建立一个表,总结我们维基中的页面引用某些宏的次数 我构建了一个名为@currentpages的临时表,其中包含55k行,如下所示: DECLARE @currentpages table( ContentID NUMERIC(19,0) NOT NULL PRIMARY KEY, PageTitle VARCHAR(255) NULL, SpaceKey VARCHAR(255) NULL, OriginalAuthor VARCHAR(25
DECLARE @currentpages table(
ContentID NUMERIC(19,0) NOT NULL PRIMARY KEY,
PageTitle VARCHAR(255) NULL,
SpaceKey VARCHAR(255) NULL,
OriginalAuthor VARCHAR(255) NULL,
LastChangedBy VARCHAR(255) NULL,
LastChangedDt VARCHAR(10) NULL,
ContentBody TEXT NULL);
DECLARE @usage table(
SpaceKey VARCHAR(255) NOT NULL PRIMARY KEY,
Macro1 NUMERIC(19,0) NULL,
Macro2 NUMERIC(19,0) NULL,
Macro3 NUMERIC(19,0) NULL);
另一张表如下所示:
DECLARE @currentpages table(
ContentID NUMERIC(19,0) NOT NULL PRIMARY KEY,
PageTitle VARCHAR(255) NULL,
SpaceKey VARCHAR(255) NULL,
OriginalAuthor VARCHAR(255) NULL,
LastChangedBy VARCHAR(255) NULL,
LastChangedDt VARCHAR(10) NULL,
ContentBody TEXT NULL);
DECLARE @usage table(
SpaceKey VARCHAR(255) NOT NULL PRIMARY KEY,
Macro1 NUMERIC(19,0) NULL,
Macro2 NUMERIC(19,0) NULL,
Macro3 NUMERIC(19,0) NULL);
(我已经简化了上面的内容;它实际上有大约40列,比如Macro1、Macro2等)我正在尝试统计(在@currentpages中)有多少引用这些不同的宏
我通过为每个可能的空格键值创建一行来初始化@usage表,并将所有宏“x”计数器归零:
INSERT INTO @usage (SpaceKey, Macro1, Macro2, Macro3)
SELECT S.spacekey, 0, 0, 0
FROM spaces S
ORDER BY S.spacekey
然后,我运行几个UPDATE语句中的第一个语句来标识每个宏引用:
UPDATE @usage
SET U.AdvancedSearch = C.Counter
FROM @usage U
INNER JOIN (SELECT SpaceKey, COUNT(*) AS Counter
FROM @currentpages
WHERE ContentBody LIKE '%{search-%' GROUP BY SpaceKey) C
ON U.SpaceKey = C.SpaceKey
这似乎工作正常,但运行时间很长。有没有更有效的方法来做我想做的事情
此数据库位于SQL Server 2005上
非常感谢,,
Betsy我可以想象,任何性能命中都将来自包含LIKE子句的子查询,因为它将进行完整的表扫描。我真的看不出还有什么会让这件事拖得太慢
您可以通过只运行子查询并将返回所需的时间与其中一列的整个更新所需的时间进行比较来测试这一点 不要为每个宏创建列,而是创建如下表
DECLARE @macrotype table(
type int NOT NULL PRIMARY KEY
, MacroName varchar(100) NOT NULL
, mask varchar(100) NOT NULL
)
DECLARE @usage table(
SpaceKey VARCHAR(255) NOT NULL PRIMARY KEY,
, MacroType int NOT NULL
, MacroCount int NOT NULL
)
一旦你有了它,你就可以通过运行
INSERT INTO @macrotype VALUES (1, 'search', '%{search-%')
, (2, 'yadayada', '%{yadayada-%')
, ...
DECLARE @c int, @m varchar(100)
DECLARE c CURSOR READ_ONLY FOR SELECT type, mask FROM @macrotype
OPEN c
FETCH NEXT FROM c INTO @t, @m
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @usage (SpaceKey, MacroType, MacroCount)
SELECT SpaceKey
, @t
, COUNT(*) AS Counter
FROM @currentpages
WHERE ContentBody LIKE @m
GROUP BY SpaceKey
FETCH NEXT FROM c INTO @t, @m
END
CLOSE c
DEALLOCATE c
在故事的结尾,您可以查询@usage表,以您希望的任何形式进行计数
SELECT MacroName, count = count(*)
FROM @usage u
JOIN @macrotype m
ON u.MacroType - m.type
GROUP BY MacroName
在55k记录上,此操作将运行几分钟
INSERT INTO @usage (SpaceKey, Macro1, Macro2, Macro3)
SELECT S.spacekey
, count(case when ContentBody LIKE '%Search Macro 1%'
then 1 else null end) as Macro1_Count
, count(case when ContentBody LIKE '%Search Macro 2%'
then 1 else null end) as Macro2_Count
, count(case when ContentBody LIKE '%Search Macro 3%'
then 1 else null end) as Macro=3Count
FROM spaces S
LEFT OUTER JOIN @CurrentPages C ON C.SpaceKey = S.SpaceKey
GROUP BY S.spacekey
还有其他更有效的方法吗?我需要在生产中运行这个,但如果我(大约)运行100个,它将运行4evah!在SQL中?不是真的-如果您需要在varchar字段中搜索文本,这正是您需要做的。另一个选项是用另一种语言(.net等)编写脚本/实用程序,它可以更轻松地处理字符串操作/搜索。我有点困惑,您在上一个查询中设置了AdvancedSearch,但我没有看到@usage中声明的列。感谢您提供此示例。它仍然可以运行30分钟,但我认为它比我以前的效率更高。。。而且它也更干净-“全文搜索”不是选项,因为搜索词包含破折号(-)。不过,将所有搜索包装在一个查询中是一种不错的方法。