我已经有了一个问题 on gis.stackexchange.com,假设可能是geoserver的问题,但是当我深入到问题的时候,我发现我有一个数据库瓶颈。当geoserver执行以下查询时,我的SQL服务器CPU使用率几乎为100%:
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%' ))--
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,我有一个空间视图:
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'发布于 2012-04-23 06:13:08
我建议您尝试将Filter()替换为STIntersects()。如果查询是由geoserver自动生成的,则可以在geoserver中直接测试该查询(至少您知道问题出在哪里):
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篇关于空间索引的好文章。
发布于 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的文章
警告:不要在生产中改变这种故意的做法,因为它会影响性能,而你最不想要的就是被大喊大叫/被解雇,因为“网络上的某个人说它会成功!”首先在开发环境中测试您的设置,看看是否适合您。
https://dba.stackexchange.com/questions/16862
复制相似问题