首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server占用了我的所有CPU

SQL Server占用了我的所有CPU
EN

Database Administration用户
提问于 2012-04-22 14:20:44
回答 2查看 1.1K关注 0票数 3

我已经有了一个问题 on gis.stackexchange.com,假设可能是geoserver的问题,但是当我深入到问题的时候,我发现我有一个数据库瓶颈。当geoserver执行以下查询时,我的SQL服务器CPU使用率几乎为100%:

代码语言:javascript
复制
SELECT "siteId","Vendor",CAST("SP_GEOMETRY".STSrid as VARCHAR) 
  + ':' + "SP_GEOMETRY".STAsText() as "SP_GEOMETRY" FROM "LiveData"."sites"
         WHERE ("SP_GEOMETRY".Filter(
    geometry::STGeomFromText('POLYGON 
    ((87.16003722182671 27.034666490477207, 
      87.16003722182671 28.328562656235395, 
      88.62121886224784 28.328562656235395, 
      88.62121886224784 27.034666490477207, 
      87.16003722182671 27.034666490477207))', 4326)) = 1 
AND ( UPPER("Vendor") LIKE 'A%'  OR  UPPER("Vendor") LIKE 'B%' ))

--

代码语言:javascript
复制
SELECT "Site_ID","Vendor",CAST("sp_geometry".STSrid as VARCHAR) 
  + ':' + "sp_geometry".STAsText() as "sp_geometry" 
FROM "LiveData"."sites"
WHERE ("sp_geometry".Filter(geometry::STGeomFromText('POLYGON ((
  82.89734190991959 26.99551618775358, 
  82.89734190991959 28.367238076413702,
  84.44641417532948 28.367238076413702, 
  84.44641417532948 26.99551618775358, 
  82.89734190991959 26.99551618775358))', 4326)) = 1 
AND ( UPPER("Vendor") LIKE 'A%'  OR 
 UPPER("Vendor") LIKE 'B%' ))

现在的问题是,当我打开多个页面,只有4-5页,网页挂起,因为它必须从数据库检索数据。

通过从基表中选择空间列SP_GEOMETRY,我有一个空间视图:

代码语言:javascript
复制
    CREATE view [LiveData].[sites]
      As
     select
     live.Site_ID as siteId,live.Site_Name,live.Vendor,live.Status,live.MI_SQL_REC_NUM,
     live.MI_STYLE,live.MI_PRINX,live.SP_GEOMETRY
     from baseTble.spatialSites live ,LiveData.liveStatus stat 
where 
live.Site_ID  = stat.siteId and stat.Code in ('x123','y345') and stat.alias = 'Neyman'
EN

回答 2

Database Administration用户

回答已采纳

发布于 2012-04-23 06:13:08

我建议您尝试将Filter()替换为STIntersects()。如果查询是由geoserver自动生成的,则可以在geoserver中直接测试该查询(至少您知道问题出在哪里):

代码语言:javascript
复制
WHERE
  ( "SP_GEOMETRY".STIntersects( 
      geometry::STGeomFromText(
        'POLYGON ((87.16003722182671 27.034666490477207, 
                   87.16003722182671 28.328562656235395, 
                   88.62121886224784 28.328562656235395, 
                   88.62121886224784 27.034666490477207, 
                   87.16003722182671 27.034666490477207))',
        4326)) = 1 
  AND
     ...
  )

(更新)

这个页面:过滤器:一只奇鸭建议Filter()只是一个快速的STIntersects(),其不同之处在于它可能返回假阳性。

它还表明,当没有可用的索引时,这两个函数具有完全相同的(和缓慢的)性能。因此,最好的方法是创建一个空间索引(如果需要,可以用STIntersects()替换Filter() )。

服务器空间索引的博客(由MSDN的@艾萨克撰写)有7篇关于空间索引的好文章。

票数 2
EN

Database Administration用户

发布于 2012-04-22 14:50:31

我对地理空间类型的研究不多,但CPU密集的事实并不令人惊讶。如果您想避免服务器的CPU与100%挂钩,我建议在实例级别查看一下您的MAXDOP设置。默认值为0,这意味着Server在处理时将耗尽所有可用的处理器(逻辑)。如果您的查询正在锁定所有CPU并导致问题,您可能需要尝试调整设置。读一读@paulrandal关于MAXDOP:http://www.sqlskills.com/BLOGS/PAUL/post/MAXDOP-configuration-survey-results.aspx的文章

警告:不要在生产中改变这种故意的做法,因为它会影响性能,而你最不想要的就是被大喊大叫/被解雇,因为“网络上的某个人说它会成功!”首先在开发环境中测试您的设置,看看是否适合您。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/16862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档