Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 构建一个汇总另一个表数据的表-优化建议?_Sql Server 2005_Tsql_Sql Optimization - Fatal编程技术网

Sql server 2005 构建一个汇总另一个表数据的表-优化建议?

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

我试图建立一个表,总结我们维基中的页面引用某些宏的次数

我构建了一个名为@currentpages的临时表,其中包含55k行,如下所示:

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记录上,此操作将运行几分钟

  • 调查全文搜索。() 我没有这方面的经验,所以不能提供建议

  • 不要对每个宏查询@CurrentPages一次,而是一次获取所有宏计数。比如:

    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分钟,但我认为它比我以前的效率更高。。。而且它也更干净-“全文搜索”不是选项,因为搜索词包含破折号(-)。不过,将所有搜索包装在一个查询中是一种不错的方法。