我刚刚了解到那里有“图形数据库”,它们更适合两个应用程序“搜索引擎”,尤其是“gis”。
为了避免讨论关系数据库是否更适合并明确需要什么样的数据库,这里有一些我想使用它的详细信息:
from_pageid INT, to_pageid INTPRIMARY KEY(from_pageid,to_pageid),INDEX(from_pageid)和INDEX(to_pageid);这将有大约 1'000'000 个条目。当使用图形数据库时,每个节点只有所有“从”和“到”链接,有或没有索引,它们就在那里,而无需查找巨大的索引。好的,现在还有一些专业:
你会向我推荐什么数据库?
希望这个问题是不言自明的。
我一直在寻找关于 sql server 2008 中的视图和地理数据类型的微软文档似乎很少/很差,我认为答案是“不,地理数据类型要么不受支持,要么在看法”; 但我不完全确定,我希望得到一些佐证。
我一直在尝试将地理数据添加到现有视图中。我的最终目标是从相关领域检索经度/纬度数据。
这是应用于表时有效但在视图中定义时无效的选择语句(简化):
SELECT
[dbo.vendor.location].Lat AS latitude,
FROM
dbo.vendor
Run Code Online (Sandbox Code Playgroud)
请注意,这[dbo.vendor.location]是字段,并且Lat是geography数据类型的纬度属性。
当该 sql 在视图中运行时,将返回以下错误:
The multi-part identifier "dbo.vendor.location.Lat" could not be bound
Run Code Online (Sandbox Code Playgroud)
编辑:
请注意,我还尝试了以下查询,结果相似:
SELECT
[dbo].[vendor].[location].Lat AS latitude,
FROM
dbo.vendor
Run Code Online (Sandbox Code Playgroud)
在这种情况下,SQL Management Studio 删除引号并返回相同的“多部分...无法绑定”错误。
以下简单测试返回错误
CREATE TABLE track (
position point NOT NULL
);
INSERT INTO track VALUES (
position=ST_PointFromText('POINT(-45.62390335574153 -3.9551761173743847)')
);
Run Code Online (Sandbox Code Playgroud)
错误:
错误 1416 (22003):无法从发送到 GEOMETRY 字段的数据中获取几何对象
我究竟做错了什么?
我试图找出位于矩形区域(信封)内的点。我在使用了一点点难度的理解性能影响&&运营商相比ST_Intersect。
但是,我想我在尝试提出我的问题时解释了我自己的问题。我无论如何都会提交它,以防它对某人有用。
&&的手册说(具有讽刺意味的是,页面名称是 geometry_overlaps.html):
&& — 如果 A 的 2D 边界框与 B 的 2D 边界框相交,则返回 TRUE。`
ST_Intersects的手册说:
如果几何/地理“在二维空间上相交”-(共享空间的任何部分),则返回 TRUE,如果不相交(它们不相交),则返回 FALSE。对于地理 - 容差为 0.00001 米(因此任何靠近的点都被视为相交)
ST_Intersects在这种情况下将返回 true。因为我&&在任何一种情况下都使用矩形边界框,所以我的目标运算符几乎做同样的事情。我想知道是否&&是我的目的最快的运营商?感觉&&必须做更少的检查,所以它必须更有效率。
这是一个直接复制自&&,ST_Intersects改编的示例:
SELECT
t1.id AS t1,
t2.id AS t2,
t1.ln && t2.ln AS "&&",
ST_Intersects(t1.ln,t2.ln)
FROM ( VALUES
(1, 'LINESTRING(0 0, 3 3)'::geometry),
(2, 'LINESTRING(0 1, 0 5)'::geometry)
) AS t1(id,ln)
CROSS JOIN (VALUES
(3, 'LINESTRING(1 2, 4 …Run Code Online (Sandbox Code Playgroud) 我在 Postgres 中有这个表,如下所示:
create table locations
(
id serial not null
constraint games_pkey
primary key,
name varchar,
location point,
)
;
Run Code Online (Sandbox Code Playgroud)
我想根据另一个位置point( x, y )作为纬度和经度进行查询;我只需要返回距离该位置 1 公里以内的记录。如何有效地选择符合该标准的记录?
我只需要在局部范围内精确的距离,因此地球曲率对我的应用程序来说不应该是一个问题,但是在这种情况下,POINT 或 GIS 是否有性能优势?
我在 stackoverflow 上发现了这个问题,它似乎做了类似的事情,但接受的答案只有代码,也没有说明它是如何工作的:https : //stackoverflow.com/questions/37827468/find-the-nearest-location-by -latitude-and-longitude-in-postgresql
在放弃 MySQL 之后,我尝试了 Elasticsearch,现在不想看看我是否可以使用 PostgreSQL/PostGIS,因为它可以让我只使用 PostgreSQL。
我需要按距离(不能完全相同)从表中获取记录并按距离排序。该表有 1000 万条记录。
当我在 PostgreSQL 上查询比在 MySQL 上的查询速度慢时,我想我一定做错了什么。
我可以做什么更好?
桌子:
id | hash_id | town | geo_pt2
geo_pt2 is geography
Run Code Online (Sandbox Code Playgroud)
指数:
CREATE INDEX geo_pt2_gix ON public.member_profile USING gist (geo_pt2)
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT hash_id, town
, ST_Distance(t.x, geo_pt2) AS dist
FROM member_profile, (SELECT ST_GeographyFromText('POINT(47.4667 8.3167)')) AS t(x)
WHERE ST_DWithin(t.x, geo_pt2, 250000)
ORDER BY dist
limit 100 offset 1000;
Run Code Online (Sandbox Code Playgroud)
解释:
Limit (cost=9.08..9.08 rows=1 width=53)
-> Sort (cost=9.07..9.08 rows=1 width=53)
Sort Key: (_st_distance('0101000020E610000088855AD3BCBB474052499D8026A22040'::geography, member_profile.geo_pt2, '0'::double precision, true))
-> …Run Code Online (Sandbox Code Playgroud) postgresql performance spatial postgis postgresql-10 postgresql-performance
我希望在空间索引上打开页面压缩。实例为2008 Enterprise。该索引预先存在于供应商提供的应用程序中。在搜索 BOL 时,它指出压缩和填充因子都是允许的。
ALTER INDEX [ix_city_citypoint] on city
REBUILD WITH (FILLFACTOR = 90, DATA_COMPRESSION = PAGE)
Run Code Online (Sandbox Code Playgroud)
消息 153,级别 15,状态 4,第 12 行
ALTER INDEX REBUILD 语句中选项 data_compression 的使用无效。
原创:
CREATE SPATIAL INDEX [ix_city_citypoint] ON [dbo].[city]
(
[citypoint]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [primary]
GO …Run Code Online (Sandbox Code Playgroud) MySQL 支持使用ST_PointFromTextSRID 来构造一个点,
ST_PointFromText(wkt[, srid [, options]])使用其 WKT 表示和 SRID 构造 Point 值。
这假设输入是众所周知的文本 (WKT)。如何构造一个纬度和经度为双精度(或浮点类型)的点。
GeoJSON 规范展示,
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [125.6, 10.1]
},
"properties": {
"name": "Dinagat Islands"
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我把它包装在一个调用中时ST_GeomFromGeoJSON,像这样,
SELECT ST_GeomFromGeoJSON($${
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [125.6, 10.1]
},
"properties": {
"name": "Dinagat Islands"
}
}$$);
Run Code Online (Sandbox Code Playgroud)
我得到错误,
错误:无效的 GeoJson 表示
spatial ×10
postgis ×5
postgresql ×5
mysql ×2
c# ×1
compression ×1
errors ×1
geojson ×1
graph ×1
json ×1
linux ×1
mariadb ×1
mysql-8.0 ×1
performance ×1
php ×1
sql-server ×1