Daha çox

SRID eyni olduğundan sorğum niyə işləmir?

SRID eyni olduğundan sorğum niyə işləmir?


Bu sorğunu işlədirəm:

Mənbə SEÇ, ST_AsText (ST_ClosestPoint (roads.geom, ST_GeomFromText ('POINT (22.256 39.569)')))) ST_Distance (roads.geom, ST_GeomFromText ('POINT (22.256 39.569)' ')'))

Mən bu cavabı izlədim və verilənlər bazamdakı geom_ways cədvəlimi həndəsə nöqtələrinin SRID -si olan 4326 -ya düzəltdim, lakin uyğun geometriyalar olmadığı üçün sorğu işləməyəcək?


ST_GeomFromText ('NOKTA (22.256 39.569)')sizə EPSG: 4326 -da bir həndəsə verməyəcək.

Sənədlərdən:

ST_GeomFromText funksiyasının 2 variantı var, birincisi SRID qəbul etmir və müəyyən bir məkan istinad sistemi olmayan bir həndəsə qaytarır. İkincisi, ikinci arqument olaraq məkan istinad id alır və bu sridin meta məlumatlarının bir hissəsi olaraq daxil olan bir ST_Geometry qaytarır. Srid spatial_ref_sys cədvəlində təyin olunmalıdır.

Beləliklə, ehtimal ki, etmək istərdiniz:ST_GeomFromText ('POINT (22.256 39.569)', 4326)

Əsasən, WKT -nin məkan istinadı anlayışı yoxdur.

EWKT istifadə edərək xüsusi bir SRID də yarada bilərsiniz, ancaq iki arqument forması ümumiyyətlə daha asandır. EWKT -də belə olardı:ST_GeomFromEWKT ('SRID = 4326; POINT (22.256 39.569)')


Sizin .GrupBy (y = & gt y.LanguageCode) .ToDictionaryAsync (y = & gt y.Key, y = & gt y.Select (z = & gt z.Name)) SQL -ə çevrilə bilməz. EF Core 3.0, vahidlərdəki bütün qeydlərin qruplaşdırılmadan və Lüğətə xəritələnmədən əvvəl verilənlər bazasından alınacağını bildiyinizə əmin olmaq üçün istisna yaradır.

LINQ GroupBy -in nə etdiyi və SQL GROUP BY -nin nəyə qadir olduğu ilə bağlı ümumi bir yanlış fikir var kimi görünür. Eyni tələyə düşdüyümdən və bu yaxınlarda başımı bura bağlamalı olduğumdan, bu məsələnin daha ətraflı izahını yazmağa qərar verdim.

Qısa cavab:

LINQ GroupBy çox fərqli SQL GROUP BY ifadəsindən: yalnız LINQ bölür əsas kolleksiya bir açardan asılı olaraq hissələrə, SQL isə əlavə olaraq toplama funksiyasını tətbiq edir bu parçaların hər birini a -ya endirmək tək dəyər.

EF, LINQ tipli GroupBy-ni yaddaşda yerinə yetirməlidir.

EF Core 3.0 -dan əvvəl bu edildi dolayısı ilə, buna görə EF bütün nəticə satırlarını endirdi və sonra LINQ GroupBy tətbiq etdi. Bununla birlikdə, bu gizli davranış, proqramçının bütöv LINQ sorğusu SQL -də yerinə yetirilir və nəticə çox böyük olduqda potensial olaraq böyük performans təsirinə malikdir. Bu səbəbdən, GroupBy -nin müştəri tərəfindən gizli qiymətləndirilməsi EF Core 3.0 -da tamamilə aradan qaldırıldı.

İndi nəticə dəstini yükləyən və yaddaşdakı LINQ əməliyyatları ilə davam edən .AsEnumerable () və ya .ToList () kimi funksiyaları açıq şəkildə çağırmaq tələb olunur.

Uzun cavab:

Aşağıdakı cədvəl həll edildi: Təlimlər bu cavab üçün işləyən bir nümunə olacaq:

Rekord X | Bu cədvəldəki Y, X tələbəsinin Y tapşırığını həll etdiyini bildirir.

Sualda, LINQ -in GroupBy metodunun ümumi istifadə halları təsvir edilir: Bir kolleksiya alın və onu hər hissədəki satırların ortaq bir açarı paylaşdığı hissələrə qruplaşdırın.

Misalımızda, hər bir tələbə üçün həll edilmiş məşqlərin siyahısını ehtiva edən bir lüğət və ltint, List & ltint & gt & gt əldə etmək istəyə bilərik. LINQ ilə bu çox sadədir:

Siyahını və Lüğəti istədiyimiz qədər dərinləşdirə bildiyimiz üçün bunu C# məlumat növləri ilə təmsil etmək asandır.

İndi bunu bir SQL sorğusu nəticəsində təsəvvür etməyə çalışırıq. SQL sorğu nəticələri ümumiyyətlə geri qaytarılan sütunları sərbəst seçə biləcəyimiz bir cədvəl kimi təqdim olunur. Yuxarıdakı sorğumuzu SQL sorğu nəticəsi olaraq təqdim etmək üçün bunu etməliyik

  • birdən çox nəticə cədvəli yaratmaq,
  • qruplaşdırılmış satırları bir sıra qoyun və ya
  • bir şəkildə "nəticə dəsti ayırıcısı" daxil edin.

Bildiyimə görə, bu yanaşmaların heç biri praktikada tətbiq olunmur. Nəticə sətirlərini bir sətirdə birləşdirməyə imkan verən MySQL-in GROUP_CONCAT kimi ən çox işləyən proqramları var (müvafiq SO cavabı).

Beləliklə görürük ki, SQL bilməz LINQ -in GroupBy anlayışına uyğun nəticələr verir.

Bunun əvəzinə SQL yalnız sözdə icazə verir toplama: Məsələn, bir şagird tərəfindən neçə məşq keçdiyini saymaq istəsək, yazarıq

Birləşdirmə funksiyaları bir sıra satırları vahid bir dəyərə endirir, ümumiyyətlə skalyar. Nümunələr satır sayı, məbləğ, maksimum dəyər, minimum dəyər və ortadır.

Bu edir EF Core tərəfindən həyata keçirilir: İcra olunur

yuxarıdakı SQL -i yaradır. EF -nin hansını bildirdiyini seçin toplama funksiyası yaradılan SQL sorğusu üçün istifadə etməlidir.

Xülasə olaraq, LINQ GroupBy funksiyası, SQL məhdudiyyətləri səbəbindən yalnız bir, iki ölçülü nəticə cədvəlini qaytarmağa imkan verən SQL GROUP BY ifadəsindən daha ümumidir. Beləliklə, sual nəticəsi və bu cavabdakı ilk nümunə kimi sorğular, SQL nəticə dəstini yüklədikdən sonra yaddaşda qiymətləndirilməlidir.

Əvəzinə dolayısı ilə Bunu edərkən, EF Core 3.0 -da, inkişaf etdiricilər, bu vəziyyətdə kiçik bir test verilənlər bazası səbəbiylə inkişaf əsnasında gözdən qaça biləcək milyonlarla sıra olan potensial olaraq böyük bir cədvəlin təsadüfən yüklənməsinin qarşısını alan bir istisna yaratmağı seçdilər.


OData'da coğrafi məlumat dəstəyi

Bu samançının təklifidir. Zəhmət olmasa OData poçt siyahısında etiraz edin.

OData, yeni ibtidailər dəsti olaraq coğrafi məlumat növlərini dəstəkləyir. Hər hansı digər primitivlər kimi istifadə edilə bilər - URL -lərdə hərf kimi, xüsusiyyətlərin növləri və dəyərləri olaraq, $ select -də proqnozlaşdırılır və s. Digər ibtidailər kimi, onlarla birlikdə istifadə oluna bilən bir sıra kanonik funksiyalar mövcuddur.

Niyə bu dizayna meyl edirik?

Bu kimi qutular dizaynı şübhə altına alır və indiyə qədərki seçimlərin səbəbini əsaslandırır.

Bu hal hazırda canlı bir sənəddir. Qərar verməyə davam edərkən bu sənədi düzəldəcəyik. Yeni qərarlarımız üçün yeni səbəblərimizi də qeyd edəcəyik.

Digər primitivlərlə müqayisədə yeganə məhdudiyyət, coğrafi məkan növlərinin varlıq açarları kimi istifadə edilməməsidir (aşağıya baxın).

Bu spesifikasiyanın qalan hissəsi, dəstəklədiyimiz coğrafi tip sistemi, coğrafi məkan növlərinin $ metadatasında necə təmsil olunduğu, dəyərlərinin Atom və JSON yüklərində necə təmsil olunduğu, URL -lərdə necə təmsil olunduğu və kanonik funksiyalar haqqında daha ətraflı məlumat verir. onlar üçün müəyyən edilmişdir.

Modelləşdirmə

İbtidai növlər

Tip sistemimiz OGC Sadə Xüsusiyyətlər həndəsə tip sisteminə möhkəm kök salmışdır. Tip sistemindən yalnız dörd yolla ayrılırıq.


Şəkil 1: OGC Sadə Xüsusiyyətlər Tipi Hiyerarşisi

Niyə alt dəst?

OData ilə əsas məqsədimiz hər kəsi ekosistemə cəlb etməkdir. Beləliklə, insanların başlamasını asanlaşdırmaq istəyirik. Növlərin və əməliyyatların sayının azaldılması insanların işə başlamasını asanlaşdırır. Daha mürəkkəb ehtiyacları olanlar üçün genişləndirmə nöqtələri var.

Birincisi, tip sistemin bir alt və əməliyyatların bir alt qrupunu ifşa edirik. Ətraflı məlumat üçün aşağıdakı bölmələrə baxın.

İkincisi, OGC tipli sistem yalnız 2 ölçülü coğrafi məlumatlar üçün təyin edilmişdir. Daha çox ölçüləri idarə edə bilmək üçün bir mövqe tərifini genişləndiririk. Xüsusilə, 2d, 3dz, 3dm və 4d coğrafi məlumatları idarə edirik. Əlavə məlumat üçün Koordinat İstinad Sistemləri (CRS) bölməsinə baxın.

Niyə həndəsi və coğrafi növləri ayırırıq?

Əslində fərqli davranırlar. Təyyarələrin bir -birinə düşməməsini təmin etmək üçün təyyarələri izləmək və uçuş yollarının kəsişdiyini müəyyən etmək üçün bir proqram yazdığınızı düşünün.

İki uçuş planınız olduğunu düşünün. Biri (0, 0) ilə (0, 60) arasında Şimala uçur. Digəri (-50, 58) -dən (50, 58) -ə qədər Şərqə uçur. Onlar kəsişirlərmi?

Həndəsi koordinatlarda açıq şəkildə edirlər. Coğrafi koordinatlarda bunların enlik və uzunluq olduğunu fərz etsək belə etmirlər.

Bunun səbəbi coğrafi koordinatların bir kürədə olmasıdır. Təyyarələr əslində qövslə hərəkət edir. Şərqə uçan təyyarə əslində şimala doğru olan təyyarənin uçuş yolunun üstündə əyilmiş bir yol tutur. Bu təyyarələr bir -birindən yüzlərlə mil uzaqlaşır.

Aydındır ki, qəza detektorumuzun bu təyyarələrin təhlükəsiz olduğunu bilməsini istəyirik.

İki növ eyni funksiyalara sahib ola bilər, lakin çox fərqli tətbiqlərə sahib ola bilərlər. Bunları iki növə bölmək funksiya icraçılarının işini asanlaşdırır. Alqoritmini seçmək üçün CRS -i yoxlamağa ehtiyac yoxdur.

Üçüncüsü, OGC tipli sistem düz yer coğrafi məlumatları üçün nəzərdə tutulmuşdur (bundan sonra həndəsi məlumatlar adlandırılacaq). OGC, yuvarlaq dünya coğrafi məlumatlarını (coğrafi məlumatlar adlanır) idarə edən bir sistem təyin etmir. Beləliklə, coğrafi məlumatlar üçün paralel növlər qrupu yaratmaq üçün OGC tipli sistemi təkrar edirik.

Coğrafi və həndəsi fərqlərə müraciət edirik topologiya növündən. Bu dəyəri ehtiva edən məkanın formasını təsvir edir.

Coğrafi məlumatlar sərhədli bir səthdə (sferoid), həndəsi məlumatlar isə sonsuz bir səthdə (müstəvidə) olduğu üçün bəzi kiçik dəyişikliklərə ehtiyac var. Bu, məsələn, bir Poliqonun tərifində özünü göstərir. Ətraflı məlumat üçün aşağıya baxaraq mümkün qədər az dəyişiklik edirik. Dəyişikliklər etsək də, mümkün olduğu qədər əvvəlki sənəti izləyirik.

Nəhayət, OData'daki digər primitivlər kimi, coğrafi primitivlər də miras istifadə etmirlər və dəyişməzdirlər. Vərəsəlik olmaması və OGC tipli sistemin alt qurulması bizə bəzi məlumatları təqdim etməkdə çətinlik yaradır. Bunu, OGC -nin əsas sinifinə çox bənzəyən bir birlik növü ilə həll edirik. Daha ətraflı məlumat üçün aşağıdakı Union növləri bölməsinə baxın.

Koordinat İstinad Sistemləri

Bir çox Koordinat İstinad Sistemini (CRS) dəstəkləsək də, bir neçə məhdudiyyət var (OGC standartı ilə müqayisədə):

  • Yalnız bir SRID tərəfindən CRSated adında dəstəkləyirik. Bu rəsmi bir SRID olmalıdır. Xüsusilə, GML kimi metadatada müəyyən edilmiş xüsusi CRS -i dəstəkləmirik.
    • Beləliklə, bəzi məlumatlar açıqlanmayacaq. Məsələn, hər bir nöqtənin [lat, uzun, dərinlik, zaman, təzyiq, temperatur] koordinatlarının olduğu bir koordinat sistemində təmsil olunan hidrodinamik oxunuş məlumatları var. Bu, hər cür sərin təhlil aparmağa imkan verir (məsələn, temperatur və zaman oxları baxımından müəyyən edilmiş bir səth üzrə məkan sorğuları), lakin OData çərçivəsindən kənardır.
    • Kodları olmayan bəzi standart koordinat sistemləri də var. Yəni bunları təmsil edə bilmədik. Məsələn: Yeni Zelandiyada və Şimali Avropada bəzi ümumi sistemlər.
    • CRS proyeksiya altında statikdir. Yuxarıda göstərilənlər proyeksiyanın nəticələri arasında belə saxlanılır.
    • Tək "təyin olunmamış" bir SRID dəyəri var. Bu, bir xidmətə CRS-in hər bir nümunəyə görə dəyişdiyini açıq şəkildə bildirməsinə imkan verir.
    • Sizin üçün bəzi koordinat dəyişiklikləri edə biləcək müştəri tərəfli kitabxanalar var.
    • Serverlər, koordinat çevrilmə funksiyalarını OGC olmayan kanonik funksiya uzantıları olaraq ifşa edə bilər. Ətraflı məlumat üçün aşağıya baxın.

    Nominal olaraq, Həndəsə/Coğrafiya tipli fərq CRS ilə lazımsızdır. Hər bir CRS təbiətcə yuvarlaq və ya düz torpaqdır. Ancaq bunu avtomatik olaraq həll etməyəcəyik. Tətbiqimiz hansı CRS -in hansı model tipinə uyğun olduğunu bilməyəcək. Modelçi həm növünü, həm də CRS -ni göstərməli olacaq.

    Coğrafiya (yuvarlaq yer) məlumatları üçün faydalı bir standart CRS var: WGS84. Heç biri təmin edilmədikdə bu defoltdan istifadə edəcəyik.

    Həndəsə (düz torpaq) məlumatları üçün standart CRS SRID 0-dır. Bu, vahiddən az ölçüləri olan ixtiyari düz bir təyyarəni təmsil edir.

    Point növləri - Edm.Point və Edm.GeometricPoint

    Niyə coğrafi növlərə qarşı qərəz var?

    Mobil cihazlar indi baş verir. Çox sayda yeni məlumat və yeni tətbiq bu cihazların yayılmasına əsaslanacaq. Hamısı məkan məlumatları üçün WGS84 -dən istifadə edirlər.

    Mobil devide inkişaf etdiriciləri, bir blogdan bir kodu kopyalamağa və ya bir şey işləməyənə qədər intellisense -ə əməl etməyə daha çox meyllidirlər. Sərt inkişaf etdiricilərin sənədləri oxumaq və hər şeyi düşünmək ehtimalı daha yüksəkdir. Beləliklə, aydın yolu mobil inkişaf etdiricilərə uyğunlaşdırmaq istəyirik.

    "Nöqtəsi" OGC görə müəyyən edilir. Təxminən, əsas topologiyada və CRS -də tək bir mövqedən ibarətdir. Edm.Point, yuvarlaq dünya (coğrafi) topologiyasındakı nöqtələr üçün istifadə olunur. Edm.GeometricPoint, düz bir torpaq (həndəsi) topologiyasında bir nöqtədir.

    Bu primitivlər statik nöqtə tipli mülklər üçün istifadə olunur. Bu növün bütün obyektləri bu əmlak üçün bir bal dəyərinə sahib olacaqlar.

    Tip nöqtəsi və ya həndəsi nöqtə ola biləcək nümunə xüsusiyyətlərə istifadəçinin cari yeri və ya avtobus dayanacağının yeri daxildir.

    LineString növləri - Edm.LineString və Edm.GeometricLineString

    "LineString" OGC görə müəyyən edilir. Təxminən, hamısı eyni topologiyada və CRS -də bu mövqelər arasında xətti enterpolasiya olan bir sıra mövqelərdən ibarətdir və bir yolu təmsil edir. Edm.LineString coğrafi LineStrings üçün istifadə olunur Edm.GeometricLineString həndəsi olanlar üçün istifadə olunur.

    Bu primitivlər statik yol tipli mülklər üçün istifadə olunur. Nümunə xüsusiyyətlər, bir avtobus marşrutu varlığının yolu və ya bu səhər qaçışımda izlədiyim yol ola bilər (Run obyektində saxlanılır).

    Çoxbucaqlı növlər - Edm.Polygon və Edm.GeometricPolygon

    "Çoxbucaqlı" OGC -ə uyğun olaraq təyin olunur. Təxminən, çuxurları ehtiva edə biləcək tək bir məhdud ərazidən ibarətdir. Xüsusi qaydalara riayət edən bir sıra LineStrings istifadə edərək təmsil olunur. Bu qaydalar həndəsi və coğrafi topologiyalar üçün fərqlidir.

    Bu primitivlər statik tək çoxbucaqlı tipli mülklər üçün istifadə olunur. Nümunələr, tək bir siyahıyaalma sisteminə daxil edilmiş ərazini və ya müəyyən bir başlanğıc nöqtəsindən müəyyən bir müddət sürməklə əldə edilə bilən sahəni əhatə edir.

    Dövlətlərin sərhədləri kimi insanların çoxbucaqlı olaraq düşündükləri bəzi şeylər əslində çoxbucaqlı deyildir. Məsələn, Havay əyalətinə hər biri tam sərhədli çoxbucaqlı olan bir neçə ada daxildir. Beləliklə, bütövlükdə dövlət tək bir çoxbucaqlı kimi təmsil oluna bilməz. Çoxpoliqondur və OData'da yalnız əsas tiplərlə təmsil oluna bilər.

    Baza növləri - Edm Coğrafiyası və Edm Geometriyası

    Baza növü, müəyyən edilməmiş bir növün coğrafi məlumatlarını təmsil edir. Müəssisəyə görə dəyişə bilər. Məsələn, bir varlıq bir nöqtəni tuta bilər, digəri isə çox xətti xətti tuta bilər. OGC iyerarxiyasında düzgün topologiyaya və CRS -ə malik olan hər hansı bir növü saxlaya bilər.

    Əsas OData əsas tipdə heç bir funksiyanı dəstəkləməsə də, müəyyən bir tətbiq uzantılar vasitəsilə əməliyyatları dəstəkləyə bilər (aşağıya baxın). Əsas OData -da, əsas növlərə malik olan xüsusiyyətləri oxuya və yaza bilərsiniz, baxmayaraq ki, onlar tərəfindən süzgəcdən keçirə və sifariş verə bilməzsiniz.

    Baza növü, açıq növlərdəki dinamik xüsusiyyətlər üçün də istifadə olunur. Bu xüsusiyyətlərdə metadata olmadığından server daha konkret bir növ deyə bilməz. Dinamik mülkiyyətin nümayəndəsi, o halda CRS və topologiyanı ehtiva etməlidir, belə ki, müştəri ondan necə istifadə edəcəyini bilir.

    Buna görə də məkan dinamik xassələri $ filter, $ orderby və bənzərlərində uzantılar olmadan istifadə edilə bilməz. Baza növü heç bir kanonik funksiyanı ifşa etmir və məkan dinamik xüsusiyyətləri həmişə əsas tipdir.

    Edm.Coğrafiya, coğrafi topologiyada və verilən CRS -də hər hansı bir dəyəri təmsil edir. Edm.Geometry, həndəsi bir topologiyada və verilən CRS -də hər hansı bir dəyəri təmsil edir.

    Baza növünün hər bir nümunəsi, OGC iyerarxiyasından əldə edilə bilən bir növə uyğun gələn xüsusi bir növə malikdir. Bir nümunə üçün təqdimat, bu nümunənin əsl növünü aydınlaşdırır.

    Beləliklə, baza tipli nümunələr yoxdur. $ Metadata, faktiki məlumatların hər bir müəssisəyə görə dəyişə biləcəyini və müştəri ora baxmalı olduğunu bildirməyin bir yoludur.

    Varlıqlar üzrə məkan xüsusiyyətləri

    Bir varlıqdakı sıfır və ya daha çox xassələr məkan tipinə malik ola bilər. Məkan tipləri adi primitivlərdir. Bütün standart qaydalar tətbiq olunur. Xüsusilə, proyeksiya altında parçalana bilməz. Bu o deməkdir ki, məsələn, LineStringin ilk nəzarət mövqeyini bir nöqtə olaraq çıxarmaq üçün $ select istifadə edə bilməzsiniz.

    Açıq növlər üçün dinamik xüsusiyyətlər bütün olaraq birlik tipində olacaq. Birlik tipində olduğu kimi, hər hansı bir nümunə üçün xüsusi növü deyə bilərsiniz. Bununla birlikdə, statik tip məlumatları yoxdur. Bu o deməkdir ki, dinamik xüsusiyyətlərə CRS və amp topologiyası daxil edilməlidir.

    Məkan-İbtidai Varlıqlar (Xüsusiyyətlər)

    Bu, qeyri-məqsəddir. Bunlara daxili bir ehtiyacımız olduğunu düşünmürük. Sözlüklərdən istifadə edərək bunu keçid xidməti ilə modelləşdirə biləcəyimizə inanırıq.

    Ünsiyyət qurmaq

    Metadata

    Yeni növlər təyin edirik: Edm.Geography, Edm.Geometry, Edm.Point, Edm.GeometricPoint, Edm.Polygon, Edm.GeometricPolygon. Hər birinin "koordinat_sistemi" adlanan CRS olan bir tərəfi var.

    Atomdakı varlıqlar

    Nə istifadə etməliyik?

    Müzakirəyə səbəb olmaq və bəlkə də pis bir işin ən yaxşısı olduğu üçün, samançı təklifi Sql Serverin istifadə etdiyi eyni GML profilindən istifadə etməkdir. Bu, tam GML-in hack edilmiş sadə bir sadələşdirilməsidir, lakin bu sahəyə olduqca uyğun gəlir.

    Burada bir neçə başqa seçim və hər biri ilə əlaqədar bəzi problemlər var:

    GeoRSS yalnız bəzi növləri dəstəkləyir.

    Tam GML çox dəstəkləyir - və buna görə də mürəkkəbdir.

    KML, gömülü qeyri-məkan məlumatları ehtiva edən məkan məlumatları üçün hazırlanmışdır. Bu, asanlıqla sorğu etmək üçün OData'dan istifadə edə bilməyəcəyiniz məlumatlar yaratmağa imkan verir. Bu coğrafi məlumatları dəstəkləməyən müştərilər tərəfindən istifadə oluna bilməsi üçün insanların bu OData obyektlərini istifadə etmələrini istərdik.

    Başqa bir seçim genişləndirilmiş WKT olardı. Bu XML deyil. Bu bizim üçün problem deyil, amma digər tətbiqçiləri narahat edə bilər (?). Daha tənqidi olaraq, WKT 3d və ya 4d mövqeləri dəstəkləmir. Mövcud məlumatların tam saxlanması və yüklənməsini dəstəkləmək üçün bunlara ehtiyacımız var. Müxtəlif uzantıların hamısı əlavə ölçülər üçün necə uzadılacağı ilə razılaşmır. Başqa bir standart orqanının doğru birini seçməsini gözləmək üçün heç bir WKT tətbiqinə bahis etməməyi üstün tuturam.

    PostGIS -in yerli XML formatına malik olmadığı görünür. EWKT -dən istifadə edirlər.

    Nəhayət, SqlServer GML profili var. Bu etibarlı bir GML profilidir və tam GML olduğu kimi ehtiyacımızdan da çox deyil. Əsasən Microsoft formatı olduğuna görə müqavimət göstərirəm. Əlbəttə ki, universal bir format yoxdursa, bəlkə də bir Microsoft formatı əldə edə biləcəyimiz qədər yaxşıdır.

    JSON -dakı varlıqlar

    Niyə GeoJSON?

    Bir JSON varlığında yaxşı axır və olduqca məntiqlidir. Həm də bütün növlərimizi və koordinat sistemlərimizi dəstəkləməyə qadirdir.

    Ancaq rəsmi bir standart deyil. Beləliklə, rəsmi standartımıza istinadla deyil, surətlə daxil etməliyik.

    Başqa bir seçim, JSON -da coğrafi məlumatlar üçün ESRI standartını istifadə etməkdir. Hər ikisi də mövcud ekosistemləri olan açıq standartlardır. Hər ikisi də ehtiyaclarımız üçün kifayət qədər görünür. Birinin digərini seçmək üçün yaxşı bir səbəbi varmı?

    GeoJSON istifadə edəcəyik. Texniki olaraq, GeoJSON bütün həndəsə ağaclarını dəstəklədiyi üçün yalnız GeoJSON alt qrupundan istifadə edirik. "Feature" və ya "FeatureCollection" növlərinin istifadəsinə icazə vermirik. Coğrafi məkan növünü metadata ilə əlaqələndirmək üçün varlıqlardan istifadə edin.

    Niyə sifariş məhdudiyyəti?

    Bu, GeoJSON primitivini metadata istifadə etmədən kompleks tipdən fərqləndirməyə imkan verir. Bu, müştərilərə metadata çıxışı olmasa belə bir JSON obyektini təhlil etməyə imkan verir.

    Bu hələ də birmənalı deyil. Başqa bir seçim, "__type" üzvü və "tip" üzvü tövsiyə etmək olar. Primitiv hələ də etibarlı GeoJSON olardı, lakin ayrılıq zamanı özünəməxsus şəkildə fərqlənə bilərdi.

    Sifariş məhdudiyyətinin daha az təsirli olduğuna inanırıq.

    Bundan əlavə, "növü" ilk növbədə GeoJSON obyektində, sonra koordinatlar, sonra isə isteğe bağlı xüsusiyyətlər sifariş edilməlidir.

    Dinamik xüsusiyyətlər

    Dinamik xüsusiyyətlərdəki coğrafi dəyərlər, bir istisna istisna olmaqla, statik xüsusiyyətlər üçün olduğu kimi təmsil olunur: CRS tələb olunur. Müştəri bu dəyəri tapmaq üçün meta məlumatları araşdıra bilməyəcək, buna görə dəyər onu göstərməlidir.

    Sorğu

    URI -lərdə coğrafi ədəbiyyat

    Niyə yalnız 2 gün?

    OGC yalnız standart 2d olduğundan, fərqli tətbiqlər 3dz, 3dm və 4d dəstəkləmək üçün necə genişləndirildiyinə görə fərqlənir. Sabitləşdikdə daha yüksək ölçülərə dəstək əlavə edə bilərik. Məsələn, eyni 3dm nöqtəsi üçün üç fərqli təqdimat var:

    • PostGIS: POINTM (1, 2, 3)
    • Sql Server: NOKTA (1, 2, NULL, 3)
    • ESRI: NOKTA M (1, 2, 3)

    Standart, ehtimal ki, sonda PostGIS və ya ESRI versiyasına yaxınlaşacaq, ancaq gözləmək və görmək məntiqlidir. Yanlış birini seçməyin dəyəri çox yüksəkdir: ekosistemimizi ikiyə bölərdik, ya da qeyri-standart olardıq.

    WKT (PostGIS, ESRI və Sql Server) üçün ən azı 3 ümumi uzantı var, lakin hamısı SRID daxil etmək üçün eyni uzantıdan istifadə edir. Beləliklə, hamısı 2d koordinatları olan dəyərlər üçün eyni təsvirdən istifadə edirlər. Budur bəzi nümunələr:

    OData 3dm -i dəstəkləsəydi, sonuncusu (hansı standartla getdiyimizə bağlı olaraq) biri kimi istifadə oluna bilər:

    Niyə GeoJSON olmasın?

    GeoJSON əslində çox məntiqlidir. Standartda istifadə olunan formatların sayını 1 azaldaraq insanların xidmət son nöqtələrinə coğrafi dəstək əlavə etmələrini asanlaşdırar. Funksiyalarda istifadə olunan varlıq yazılarını təmsil etmək üçün JSON -dan istifadə etməyi də düşünürük. Nəhayət, 2 -dən çox ölçü üçün dəstəyi təmin edəcək.

    Bununla birlikdə, JSON -un bir çox yuva mötərizəsi var və bunlar GeoJSON -da önəmlidir. Sənəd orqanlarında bu yaxşıdır, burada oxunaqlı olmaq üçün xətt kəsiklərindən istifadə edə bilərsiniz. Ancaq URL -lərdə problem var. Aşağıdakı nümunəyə baxın (müqayisə üçün EWKT təsviri yuxarıdadır):

    Hər yerdə istifadə edilə bilməz

    Niyə də yox?

    Coğrafi dəyərlər nə bərabərliklə müqayisə olunur, nə də qismən sıralanır. Buna görə də, bu əməliyyatların nəticələri qeyri -müəyyən olardı.

    Üstəlik, coğrafi məkan növlərinin çox uzun hərfi təsvirləri var. Bu, coğrafi açarları olan bir sıra obyektlər boyunca gedən sadə bir URL oxumağı çətinləşdirəcək.

    Müəssisənizin paralellik nəzarətinin coğrafi xüsusiyyətlərə dəyişikliklər daxil etməsi lazımdırsa, ehtimal ki, bir növ Müəssisə səviyyəli versiya izləmə istifadə etməlisiniz.

    Coğrafi məkan primitivləri lt, eq və ya oxşar müqayisə operatorları ilə müqayisə oluna bilməz.

    Coğrafi məkan primitivləri açar kimi istifadə edilə bilməz.

    Coğrafi məkan ibtidailəri müəssisənin ETag -ın bir hissəsi kimi istifadə edilə bilməz.

    URL -lərdəki məsafə ədəbiyyatı

    Yuxarıdakı qəhvə mağazası axtarışı kimi bəzi sorğular bir məsafəni təmsil etməlidir.

    Məsafə iki topologiyada eyni şəkildə təmsil olunur, lakin fərqli şərh olunur. Hər bir halda, float skaleri kimi təmsil olunur. Vahidlər müqayisə edildiyi və ya hesablandığı əmlak üçün topologiya və koordinat sistemi ilə şərh olunur.

    Bir təyyarə vahid olduğu üçün həndəsi koordinatlardakı məsafələri bu koordinat sisteminin vahidləri baxımından təyin edə bilərik. Bu, hər bir oxun koordinatları üçün eyni vahidi istifadə etdiyi müddətdə işləyir, bu ümumi haldır.

    Coğrafi topologiyalar mütləq vahid deyil. -125 və -124 uzunluqları arasındakı məsafə dünyanın bütün nöqtələrində eyni deyil. Qütblərdə 0 -a gedir. Eynilə, 30 ilə 31 dərəcə enlik arasındakı məsafə, 30 ilə 31 dərəcə uzunluq arasındakı məsafə ilə eyni deyil (ən azından hər yerdə deyil). Beləliklə, əsas koordinat sistemi mövqeyi yaxşı ölçür, lakin məsafəni təsvir etmək üçün işləmir.

    Bu səbəbdən, hər bir coğrafi CRS, məsafələr üçün istifadə ediləcək bir vahidi də təyin edir. Əksər CRS -lər üçün bu sayğaclardır. Ancaq bəziləri ABŞ ayaqları, Hindistan ayaqları, Alman sayğacları və ya digər hissələrdən istifadə edirlər. Bir məsafə skalyarının mənasını təyin etmək üçün, geliştirici cəlb olunan CRS üçün istinadı oxumalıdır.

    Yeni Kanonik Funksiyalar

    Bu kanonik funksiyaların hər biri müəyyən coğrafi məkan növləri üzrə müəyyən edilmişdir. Beləliklə, hər bir coğrafi -ibtidai növün uyğun kanonik funksiyalar dəsti vardır. Verilmiş bir coğrafi məkan ibtidai tipini dəstəkləyən bir OData tətbiqi $ filtrindəki uyğun kanonik funksiyalardan istifadə edərək dəstək verməlidir. $ Orderby -də müvafiq kanonik funksiyalardan istifadə edərək dəstək ola bilər.

    Bunlar doğru adlardır?

    Bu qanuni funksiyaları Geo.distance və s. Kimi təyin etməyi düşünə bilərik. Beləliklə, standart OGC funksiyaları üçün fərdi server uzantıları əsas OData kimi hiss ediləcəkdir. Bu, Geoda icazə verilən funksiyalar dəstini açıq şəkildə ifadə etdiyimiz (və ya istinad etdiyimiz) müddətdə işləyir.

    Məsafə

    Məsafə, nöqtələr arasında təyin olunan kanonik bir funksiyadır. Yuxarıda göstərildiyi kimi bir məsafəni qaytarır. İki arqument eyni topologiyadan və CRS -dən istifadə etməlidir. Məsafə həmin topologiyada ölçülür. Məsafə nöqtələr üçün uyğun funksiyalardan biridir. Məsafə, coğrafi nöqtələr üçün ekvivalent semantikası ilə üst -üstə düşən sahələri üçün OGC ST_Distance metoduna bərabər olaraq təyin olunur.

    Kəsişir

    İntersects, bir nöqtənin bir çoxbucağın qapalı məkanında olub olmadığını müəyyənləşdirir. Hər iki arqument eyni topologiyadan və CRS -dən olmalıdır. Boole dəyərini qaytarır. Kəsişmələr, həm nöqtələri, həm də çoxbucaqları ehtiva edən hər hansı bir tətbiq üçün uyğun bir funksiyadır. Kəsişmələr, coğrafi məlumatların eyni semantikası ilə uzadılmış üst -üstə düşmə sahəsindəki OGC -nin ST_Intersects -ə bərabərdir.

    Uzunluq

    Uzunluq, xətti xəttin ümumi yol uzunluğunu qaytarır. Yuxarıda göstərildiyi kimi bir məsafəni qaytarır. Uzunluq xətlər üçün uyğun bir funksiyadır. Uzunluq həndəsi xətlər üçün OGC ST_Length əməliyyatına bərabərdir və coğrafi məlumatların ekvivalent semantikası ilə uzadılır.

    Niyə bu alt dəst?

    Ən çox yayılmış iki ssenariyə uyğundur: yaxınlığımdakı bütün maraqlı obyektləri tapın və müəyyən bir bölgədəki bütün maraqlı obyektləri tapın (məsələn, bir görüntü sahəsi və ya xəritədə istifadənin çəkdiyi sahə).

    Texniki olaraq, bu ssenarilər üçün xətlər və uzunluq lazım deyil. Onları saxladıq, çünki spesifikasiyalar onsuz cırtdan hiss etdi.

    Bütün digər OGC funksiyaları

    Bunları dəstəkləmirik, çünki verilənlər bazası ilə dəstəklənməyən bir serveri ayağa qaldırmağı asanlaşdırmaq istəyirik. Xüsusilə coğrafi koordinatlarda bəzilərini həyata keçirmək çox çətindir.

    OGC Sadə Xüsusiyyətlər funksiyalarını idarə edə bilən bir provayder, bunları uyğun geo -məkan primitivlərində Funksiyalar olaraq ortaya çıxara bilər (yeni funksiya dəstəyindən istifadə edərək).

    Bu standart funksiyalar üçün "Geo" ad alanını ayırırıq. Əgər funksiya Sadə Xüsusiyyətlərdə göstərilən funksiyaya uyğun gəlirsə, onu bu ad alanına yerləşdirməlisiniz. Funksiya OGC spesifikasiyasına cavab vermirsə, onu bu ad alanına yerləşdirməməlisiniz. OData spesifikasiyasının gələcək versiyaları bu ad sahəsində daha çox kanonik funksiyalar təyin edə bilər. Ad sahəsi, mövcud tətbiqləri pozmadan bu tip uzantılara icazə vermək üçün ayrılmışdır.

    Sadə Xüsusiyyətlər standartının SQL versiyasında, funksiya adlarının hamısı ad aralığını təmin etmək üçün ST_ ilə başlayır. ODatanın həqiqi ad sahələrinə malik olduğu üçün bu yalançı ad sahəsinə ehtiyac yoxdur. Beləliklə, Coğrafi ad sahəsinə yerləşdirildikdə ST_ ST_ daxil edilməməlidir. Eynilə, adı OData'daki digər kanonik funksiyalara uyğun olaraq kiçik hərflərə çevrilməlidir. Məsələn, OGC -nin ST_Buffer OData -da Geo.buffer olaraq açılacaq. Bu, CORBA -da Sadə Xüsusiyyətlərin tətbiqinə bənzəyir.

    Bütün digər coğrafi funksiyalar

    Hər hansı digər coğrafi əməliyyatlar Funksiyalardan istifadə etməklə ifşa oluna bilər. Bu funksiyalar spesifikasiyanın bu hissəsi ilə heç bir şəkildə təyin olunmur. Ad aralığı problemləri də daxil olmaqla daha çox məlumat üçün Funksiyalar bölməsinə baxın.

    Nümunələr

    Yaxınlığımda qəhvə mağazaları tapın

    Sürmə vaxtı ilə ən yaxın 3 qəhvəxananı tapın

    Bu birbaşa OData tərəfindən dəstəklənmir. Ancaq bir uzantı ilə idarə edilə bilər. Misal üçün:

    Diqqət yetirin ki, distanceto args -də simmetrik olsa da, MyNamespace.driving_time_to olmaya bilər. Məsələn, bir tərəfli küçələri nəzərə ala bilər. Bu funksiyanı təyin edən məlumat xidmətinə aiddir.

    Marşrutlar üzrə məsafəni hesablayın

    İşləmək üçün kifayət qədər yaxın olan bütün evləri tapın

    Bu nümunə üçün, bir nöqtədə (xidmət əməliyyatı vasitəsi ilə) sürücü vaxtı çoxbucaqlılarını söyləyə biləcək bir OData xidmətinin olduğunu düşünək. Evləri axtara biləcək başqa bir OData xidməti var. 15 dəqiqə ərzində işə başlaya biləcəyiniz qiymət aralığında evlər tapmaq üçün onları əzmək istəyirsiniz.

    Sonra, faktiki axtarış sorğusunu ikinci son nöqtəyə göndərərdiniz:

    Bu URL -ni qısaltmağın bir yolu varmı? Və bəlkə də bunu bir sorğuda edin?

    Bu, əslində belə bir vəziyyət üçün çox sadə çoxbucaqlıdır. Bu, yalnız bir deşik olan bir kvadratdır. Əsl sürücülük çoxbucağı çoxlu deşiklər və daha çox sərhəd nöqtələri ehtiva edərdi. Beləliklə, son sorğudakı çoxbucaqlı URL-də 3-5 dəfə uzun olacaq.

    URL-lərdə istinad arqumentlərini dəstəkləmək (sahələrarası dəstəyi ilə) çox gözəl olardı. Sonra bütün nümunəni tək bir sorğuda təmsil edə bilərsiniz:

    Ancaq bu gün OData -da dəstəklənmir.

    Tamam, amma URL -ni qısaltmağın başqa yolu yoxdurmu? Bəzi serverlər bu uzunluğu idarə edə bilmirlər!

    Seçimlərə baxırıq. Məqsəd GET qabiliyyətini və önbellek qabiliyyətini qorumaqdır. Parametrlərdə dəyişiklik URI -də görünməlidir ki, önbelleğe alma düzgün işləsin.

    Mövcud qabaqcıl fikir, müştərinin parametr dəyərlərini başlığa yerləşdirməsinə icazə verməkdir. Bu başlıqda ad/dəyər cütlərinin JSON lüğəti var. Əgər belədirsə, o zaman həmin lüğətin hash kodunu sorğu sətrinə yerləşdirməlidir. Yaranan sorğu belə görünür:

    Əlbəttə ki, bu formatla bağlı heç bir qərar yoxdur. Məsələn, bu başlıq dəyəri tam olaraq JSON -da olmalıdır (bir JSON yükü ilə eyni formatdan istifadə edilməlidir)? JSON əvəzinə forma kodlaşdırılmalıdır? Bəlkə də bütün sorğu sətri URL -də yalnız $ query = HASHCODE olmaqla başlıqda olmalıdır? Və daha çox seçim var.


    Şəxsi saxlanılan sorğu yaratmaq

    Bir sorğunu saxladığınızda və görmə qabiliyyətini təyin etdiyiniz zaman Şəxsi, sorğuya yalnız siz baxa, yeniləyə və ya silə bilərsiniz.

    Şəxsi paylaşılan sorğu yaratmaq üçün:

    Konsol

    Bulud Konsolunda BigQuery səhifəsini açın.

    Basın Yeni sorğu tərtib edin.

    Daxil olan SQL -də etibarlı bir SQL sorğusu daxil edin Sorğu redaktoru mətn sahəsi. Məsələn, Cloud Console sürətli başlanğıcından istifadə edə bilərsiniz.

    Basın Sorğunu yadda saxla.

    İçində Sorğunu yadda saxla dialoq, sorğunuz üçün bir ad daxil edin, qurun GörünürlükŞəxsi (yalnız siz redaktə edə bilərsiniz)və sonra vurun Yadda saxla.

    Saxlanan sorğunuza baxmaq üçün vurun Saxlanan Sorğular. The Şəxsi sorğular nişanı standart olaraq açılır.


    $ ('Sinif adı') kimi jQuery vasitəsi ilə bir DOM sorğusu yerinə yetirdiyiniz zaman, bu element üçün DOM-u aktiv şəkildə axtardı və bütün jQuery prototip metodlarını əlavə edərək həmin elementi geri qaytardı.

    JQuery zənciri və ya hadisə içərisində olduğunuzda, DOM sorğusunu yenidən işə salmağa ehtiyac yoxdur, $ (bu) kontekstindən istifadə edə bilərsiniz. Eynilə:

    $ (bu) əvvəlcə tələb etdiyiniz elementi saxlayacaq. Bütün jQuery prototip metodlarını yenidən bağlayacaq, ancaq DOM -u yenidən axtarmağa ehtiyac qalmayacaq.

    Artıq mövcud olmayan bir veb blogdan sitat, ancaq tarix naminə burda qoyacağam:

    Fikrimcə, ən yaxşı jQuery performans göstərişlərindən biri, jQuery -dən istifadənizi minimuma endirməkdir. Yəni, jQuery ilə düz JavaScript istifadə etmək arasında bir tarazlıq tapın və başlamaq üçün yaxşı bir yer 'bu' ilədir. Bir çox inkişaf etdirici $ (bu) yalnız geri çağırışlar içərisində çəkic olaraq istifadə edir və bunu unudur, amma fərq fərqlidir:

    Bir jQuery metodunun anonim geri çağırma funksiyasının içərisində olduqda, bu, mövcud DOM elementinə istinaddır. $ (bu) bunu jQuery obyektinə çevirir və jQuery metodlarını ifşa edir. Bir jQuery obyekti, DOM elementlərinin möhkəmləndirilmiş bir dəstəsindən başqa bir şey deyil.


    3 Cavablar 3

    İlk sualınıza cavab vermək üçün sizə sual vermək istərdim:

    Bununla silahlandığınızda bağlantı mənbəyini əldə edəcəksiniz, məsələn. mənim vəziyyətimdə java üçün:

    Beləliklə, zəncirimin/usr/bin/java -& gt/etc/alternatives/java -& gt kimi getdiyini görürsən. .

    Unfortunately, I don't have an answer to your second question. I've been searching for a solution for this some time ago, but it seems that there is no simple workaround, yet. What you could do is writing some hack to parse the output of the --query call, maybe like this:

    which you could then use as input for the --install call. But since this is quite messy in my opinion I won't recommend it. Instead you might want to have a look at galternatives , a front-end to the alternatives system. Even if I don't like to use graphical stuff for such basic jobs it is quite convenient and I ended up using this tool instead of the command line tools.

    I've been curious how update-alternatives knows what's the command symlink and took a short look into the sources. Of course the alternatives system has to store the config for each group and it turns out that it's called administrative directory and written on the man page -)

    You'll find this information in /var/lib/dpkg/alternatives (by default). The second line in each of these files defines the master link you're looking for. You may extract it like this:

    However, this is just a workaround for those having an older version of update-alternatives .


    Traffic View

    What does Traffic View do?

    Traffic View is a feature of Traffic Manager that helps you understand more about your users and how their experience is. It uses the queries received by Traffic Manager and the network latency intelligence tables that the service maintains to provide you with the following:

    • The regions from where your users are connecting to your endpoints in Azure.
    • The volume of users connecting from these regions.
    • The Azure regions to which they are getting routed to.
    • Their latency experience to these Azure regions.

    This information is available for you to consume through geographical map overlay and tabular views in the portal in addition to being available as raw data for you to download.

    How can I benefit from using Traffic View?

    Traffic View gives you the overall view of the traffic your Traffic Manager profiles receive. In particular, it can be used to understand where your user base connects from and equally importantly what their average latency experience is. You can then use this information to find areas in which you need to focus, for example, by expanding your Azure footprint to a region that can serve those users with lower latency. Another insight you can derive from using Traffic View is to see the patterns of traffic to different regions which in turn can help you make decisions on increasing or decreasing invent in those regions.

    How is Traffic View different from the Traffic Manager metrics available through Azure monitor?

    Azure Monitor can be used to understand at an aggregate level the traffic received by your profile and its endpoints. It also enables you to track the health status of the endpoints by exposing the health check results. When you need to go beyond these and understand your end user's experience connecting to Azure at a regional level, Traffic View can be used to achieve that.

    Does Traffic View use EDNS Client Subnet information?

    The DNS queries served by Azure Traffic Manager do consider ECS information to increase the accuracy of the routing. But when creating the data set that shows where the users are connecting from, Traffic View is using only the IP address of the DNS resolver.

    How many days of data does Traffic View use?

    Traffic View creates its output by processing the data from the seven days preceding the day before when it is viewed by you. This is a moving window and the latest data will be used each time you visit.

    How does Traffic View handle external endpoints?

    When you use external endpoints hosted outside Azure regions in a Traffic Manager profile you can choose to have it mapped to an Azure region which is a proxy for its latency characteristics (this is in fact needed if you use performance routing method). If it has this Azure region mapping, that Azure region's latency metrics will be used when creating the Traffic View output. If no Azure region is specified, the latency information will be empty in the data for those external endpoints.

    Do I need to enable Traffic View for each profile in my subscription?

    During the preview period, Traffic View was enabled at a subscription level. As part of the improvements we made before the general availability, you can now enable Traffic View at a profile level, allowing you to have more granular enabling of this feature. By default, Traffic View will be disabled for a profile.

    If you enabled Traffic View at a subscription level during the preview time, you now need to re-enable it for each of the profile under that subscription.

    How can I turn off Traffic View?

    You can turn off Traffic View for any profile using the Portal or REST API.

    How does Traffic View billing work?

    Traffic View pricing is based on the number of data points used to create the output. Currently, the only data type supported is the queries your profile receives. In addition, you are only billed for the processing that was done when you have Traffic View enabled. This means that, if you enable Traffic View for some time period in a month and turn it off during other times, only the data points processed while you had the feature enabled count towards your bill.


    Detal

    I ran into the nasty situation where an ALTER TABLE statement failed due to a foreign key not being dropped earlier. This led to some inconsistencies in the InnoDB data dictionary (probably due to http://bugs.mysql.com/bug.php?id=58215).

    Error on rename of './db/#sql-482c_8448f' to './db/visits' (errno: 150)

    As I couldn't recover the #sql-482c_8448f table to visits, I decided to reimport it from a backup done just before the alter. However this failed. On investigation:

    • The constraint had been removed from INFORMATION_SCHEMA.TABLE_CONSTRAINTS and INFORMATION_SCHEMA.STATISTICS
    • But the constraint was still visible in INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
    • The table didn't exist so I couldn't drop the foreign key
    • I couldn't create the table without errors

    3 Cavablar 3

    PostgreSQL and many other RDBMSs often struggle with OR predicates.

    What often happens, and has happened in this case, is that the compiler decides that it has no way of implementing the two OR conditions via a single seek, and instead scans the whole index, evaluating the two (or more) conditions on every row.

    This is despite the more obvious (to a human) method of an Index Union.

    What you are doing is a very common trick to help the compiler and force an Index Union. It is now evaluating the two sides entirely separately, and in this case it is much faster.

    It may not always be faster, for example if location_type = 2 was a very large proportion of the table. The benefit is more obvious when the two conditions are very different in performance.

    For example, WHERE OR someName = @name the first condition is a straight seek on a single row, whereas the second condition is a seek to a few rows. The compiler cannot satisfy this with a single seek, it therefore often jumps to scanning the whole table. An Index Union helps here because you can utilize an index on id and another index on someName

    Jeff already hinted at this, but I feel the need to point out the elephant in the room:
    The two queries are not equivalent!

    UNION aradan qaldırır all duplicates across the SELECT list.
    While the other query with OR keeps them.

    You have SELECT * FROM geolocations , an no other tables in the FROM list. So if there are no duplicate rows in the table (which is guaranteed by any UNIQUE index on NOT NULL columns including PRIMARY KEY and UNIQUE constraints), there cannot be duplicate in the result and the two queries are equivalent after all. But any JOIN or any SELECT list with a (not-unique) subset of columns can introduce duplicate rows in the result!

    Using UNION ALL instead is even further off. O istehsal edir duplicates that OR -ed predicates will not. If the same row qualifies for multiple OR -ed predicates, it qualifies once. Rewriting with UNION ALL will select that same row multiple times.

    There is no way to filter "bad" duplicates and keep the "good" ones with UNION / UNION ALL . So Postgres cannot generally replace cases of "ugly OR " with UNION plans. Even where it could, it's not certain that UNION will, in fact, be faster.

    But Postgres can typically combine multiple OR -ed predicates on the same table in a bitmap index scan. Görmək:

    Bir "ugly OR " is where predicates on different underlying tables are OR -ed together. (Or even the same table, but separate instances like in your case.) This can make queries more expensive, even when no indexes are involved. But it gets particularly expensive, when an efficient index scan is foiled by this. (Indexes on different tables cannot be combined in a bitmap index scan!) It typically matters most for selective queries returning a very small percentage of underlying big tables. When more than a few percent of all rows have to be read anyway, index scans lose their power. Ugly OR s don't hurt as much in those queries.

    Related blog post by Laurenz Albe:

    Çözümlər

    First of all, your use of CONCAT() is səhv. It concatenates offspring with a leading / for root nodes with ancestry IS NULL . Like '/1' instead of '1' . CONCAT_WS() would be correct. Kimi:

    Still ugly. If you run queries like this a lot you might do more. If the table is read-only, add a boolean flag named has_children . Else consider a MATERIALIZED VIEW with that extra column or keep the table column current with triggers. Then your query can just be:

    has_children is typically not selective, so the query produces a lot of result rows and is never going to be very cheap (though a lot cheaper). Indexing the column won't help. We'd need complete information to maybe find a different angle. That's beyond the scope of this question.

    Either way, if you need that redundant ancestry with every row, consider a proper array with a GIN index on it instead of the ugly string. Or maybe the additional module ltree, which is old, but for that purpose exactly.


    BigQuery's views are logical views, not materialized views. Because views are not materialized, the query that defines the view is run each time the view is queried. Queries are billed according to the total amount of data in all table fields referenced directly or indirectly by the top-level query. For more information, see query pricing.

    • For information on creating views, see Creating views.
    • For information on creating an authorized view, see Creating authorized views.
    • For information on listing views, see Listing views.
    • For information on getting view metadata, see Getting information about views.
    • For information on updating views, see Updating views.
    • For more information on managing views, see Managing views.

    Başqa cür qeyd edilmədiyi təqdirdə, bu səhifənin məzmunu Creative Commons Attribution 4.0 Lisenziyası altında və kod nümunələri Apache 2.0 Lisenziyası altında lisenziyalaşdırılmışdır. Ətraflı məlumat üçün Google Yaradıcı Sayt Siyasətlərinə baxın. Java, Oracle və/və ya filiallarının qeydiyyatdan keçmiş ticarət nişanıdır.


    Videoya baxın: Spatial reference part 3 Geographic Coordinate System