Daha çox

Məlumat mənbəyini düzəltməyə çalışarkən şəkillərin sayı cədvəl qeydlərinin sayına uyğun gəlməyən nə deməkdir?


Bir .shp faylından arcdakı bir məlumat mənbəyini düzəltməyə çalışıram. Hər dəfə düzgün .shp faylı ilə uyğunlaşdırdığımda "Formaların sayı qeyd cədvəllərinin sayına uyğun gəlmir" deyən bir səhv mesajı göstərilir. Həm də istədiyiniz .shp faylını xəritəyə əlavə etməyimə icazə verməyəcək. Bu əlaqəni düzəltmək üçün bir yol varmı?


Bu mövzuda bir Esri texniki məqaləsi var. Bu vəziyyət tez-tez (bilmədən) kimsə Excel-də shapefile .dbf faylı açdıqda və dəyişikliklər etdikdə yaranır. Əslində, məqalə bir Shapefile Təmir Alətindən istifadə etməyi tövsiyə edir. Bu həll şəklini dəyişdirəcəyini unutmayın, buna görə bir ehtiyat nüsxə yaradın.


HƏLL OLUNAN PROBLEM

Bu problemin həqiqətən sadə bir həlli var. İşləyir.

Bu problem ümumiyyətlə iş stansiyanız birdən-birə dayandıqda və shapefile saxlaya bilmədiyiniz zaman baş verir. Arxa yenidən shapefile yüklədikdə, "Formaların sayı qeyd masalarının sayına uyğun gəlmir" səhv mesajı alacaqsınız.

Bunun sadə bir həlli var,

səhv şəkilləri QGIS-ə əlavə edin, QGIS o shapefile səhvsiz yükləyəcək, sonra yeni vektor qat yaratmaq üçün QGIS istifadə edərək həmin shapefili ixrac edəcəkdir.

Arc'a yeni yaradılmış vektor qatını və ya shapefile yükləyin və işləməlidir.

Bu shapefile təmir alətlərindən fərqli olaraq, bu metod xüsusiyyətlərinizi bütöv saxlayacaqdır. Yalnız cədvəl qeydlərinin sayına uyğun son qeydləri siləcəkdir


New Jersey Sürücüsü və # 39s Lisenziya Kodlarının Dekodlaşdırılması

New Jersey-də Sürücü Lisenziyası nömrələri təsadüfi deyil. Formatı izləyirlər: Affff lllii mmyye, burada A, şəxsin soyadının ilk hərfidir, ffff, soyadının qalan hərflərinin dörd rəqəmli ədədi, lll isə tam adın a ilə uyğunlaşdırılmasıdır. üç rəqəmli ədədi və ii orta başlanğıcı təmsil edən bir koddur (aşağıdakı cədvələ əsasən:

Başlanğıcla uyğun sayın 10 * sütun nömrəsi + sıra nömrəsi olduğu yerdə. mm anadan olan aya, yy anadan olan ilə uyğun gəlir. e göz rəngi (BRO, BLU, GRY, GRN, BLK və s. ilə uyğun gələn 1-8 dəyər)

Anlamadığım tək şey adların tam dəyərlərə necə uyğunlaşdırılmasıdır. Soyad xəritələri üçün cəmi 5 nümunəm var: (ilk hərfi görməli olmadığına görə eşleme)

Adlar üçün yalnız dördüm var:

Kimsənin tətbiqetmənin necə edildiyi barədə bir fikri varmı və ya hətta leksikoqrafiya qaydasını (& lt =, & lt) qoruyarkən maksimum 25 uzunluqlu sətirdən dörd rəqəmli və ya üç rəqəmli ədədi yığacaq ümumi bir Xəritəçəkmə funksiyası varmı?

Çalışdığım şeylər

Hər hərfi 1-26 rəqəminə çevirin. Sonra yalnız ilk dörd rəqəmi götürərək qaydanı 26 ^ 3 * birinci nömrə + 26 ^ 2 * ikinci nömrə + 26 * üçüncü + dördüncü yaradın. Sonra bu ədədi 26 ^ 4 + 26 ^ 3 + 26 ^ 2 + 26-ya bölün və ondalığı 0-9999-a bərabərləşdirmək üçün 10000-ə vurun. Bu, aşağıdakı xəritələri yaradır:

Ən çox yayılmış 10.000 soyadın siyahısını əldə edin. İkinci hərflə sifariş verin və indeksə baxın. Bu, aşağıdakı xəritələri istehsal edir:

Hər məktub 10.000-i bölür. Birinci rəqəm (1-26-ya görə) onu 26 hissədən birinə ayırır. İkincisi, parçanı 26-dan birinə ayırır və s. Bu, aşağıdakı xəritələri istehsal edir:

İlk dörd hərfin hər birini 1-26-ya çevirin. Hamısını birləşdirin, nəticəni 10.000-ə vurun və 26262626-a bölün.

Yuxarıdakıları 0-25 ilə edin, 25252525-ə bölün. Bu, aşağıdakı xəritələri istehsal edir:

Əlavə nümunələr

Yuxarıdakı nümunələrin hamısının doğru olduğuna inansam da, daha orijinal nümunə məlumat nöqtələrini izləməyə çalışdım. Zəmanət verə biləcəyim şəxslər aşağıdadır:


2 Cavablar 2

K-orta qruplaşdırmanın qarışıq tipli məlumatlarla aparılmaması barədə haqlısınız. K-vasitələri, klasterli müşahidələr və klaster centroid arasındakı klaster daxilində kvadrat Öklid məsafələrini minimuma endirən bir bölmə tapmaq üçün sadə bir axtarış alqoritmi olduğundan, yalnız kvadrat kvadrat Öklid məsafələrinin mənalı olacağı məlumatlarla istifadə olunmalıdır.

Məlumatlarınız qarışıq tip dəyişənlərdən ibarət olduqda, Gower məsafəsini istifadə etməlisiniz. CV istifadəçisi @ttnphns burada Gower-ın məsafəsinə dair əla baxışa malikdir. Əslində, dəyişən növü üçün uyğun bir məsafədən istifadə edərək (məsələn, davamlı məlumatlar üçün Öklid və s.) Sıra son məsafəsi $ i $ - dan hər dəyişən üçün sıralarınız üçün bir məsafə matrisi hesablayırsınız. $ i '$ hər dəyişən üçün məsafələrin ortalama (ola bilər). Xəbərdar edilməli bir şey, Gower-ın məsafəsinin əslində bir metrik olmamasıdır. Buna baxmayaraq, qarışıq məlumatlarla Gower-in məsafəsi böyük ölçüdə şəhərdəki yeganə oyun.

Bu nöqtədə, orijinal məlumat matrisinə ehtiyac duymaq əvəzinə bir məsafə matrisi üzərində işləyə biləcək hər hansı bir klaster üsulundan istifadə edə bilərsiniz. (Qeyd edək ki, k-vasitələri sonuncusuna ehtiyac duyur.) Ən populyar seçimlər medoidlər arasında bölüşdürmələrdir (mahiyyət etibarilə k-vasitələri ilə eyni olan, lakin centroiddən daha çox mərkəzi müşahidə tətbiq edən PAM), müxtəlif iyerarxik klasterləşmə yanaşmaları (məsələn. , hiyerarşik qruplaşma ilə orta, tək əlaqəli və tam əlaqə; son klaster tapşırıqlarını almaq üçün 'ağacı kəsəcəyinizə' qərar verməlisiniz) və daha çevik klaster şəkillərinə imkan verən DBSCAN.

Budur sadə bir R demosu (nb., Həqiqətən 3 qrup var, lakin məlumatlar əsasən 2 qrupa uyğun gəlir):

PAM ilə müxtəlif sayda qrupları axtararaq başlaya bilərik:

Bu nəticələr hiyerarşik klasterləşmənin nəticələri ilə müqayisə edilə bilər:

Median metodu 2 (ehtimal 3) qrupu təklif edir, tək yalnız 2-ni dəstəkləyir, lakin tam metod gözümə 2, 3 və ya 4 təklif edə bilər.

Nəhayət, DBSCAN-ı sınaqdan keçirə bilərik. Bunun üçün iki parametr göstərilməlidir: eps, 'çatma məsafəsi' (iki müşahidənin bir-birinə bağlanması üçün nə qədər yaxın olmalıdır) və minPts (onlara zəng etmək istəməzdən əvvəl bir-birinə bağlanması lazım olan minimum nöqtələrin sayı) 'klaster'). MinPts üçün bir qayda, ölçülərin sayından birindən çoxunu istifadə etməkdir (bizim vəziyyətimizdə 3 + 1 = 4), lakin çox kiçik bir rəqəmin olması tövsiyə edilmir. Dbscan üçün standart dəyər 5-dir, buna sadiq qalacağıq. Çatılma məsafəsi barədə düşünməyin bir yolu məsafələrin yüzdə birinin verilən dəyərdən az olduğunu görməkdir. Məsafələrin paylanmasını araşdıraraq bunu edə bilərik:

Məsafələrin özləri görmə qabiliyyəti ilə 'daha yaxın' və 'daha uzaq' qruplara yığılırlar. .3 dəyəri məsafələrin iki qrupu arasında ən təmiz şəkildə fərqlənir. Çıxışın fərqli eps seçimlərinə həssaslığını araşdırmaq üçün .2 və .4'ü də sınaya bilərik:

Eps = .3 istifadə etmək çox təmiz bir həll verir (keyfiyyətcə ən azı) yuxarıdakı digər metodlardan gördüklərimizlə razılaşır.

Heç bir mənalı olmadığından 1-ci qrup, fərqli qruplaşmalardan 'klaster 1' adlandırılan müşahidələrə uyğun gəlməyə çalışarkən diqqətli olmalıyıq. Bunun əvəzinə, cədvəllər düzəldə bilərik və bir uyğunluqda 'klaster 1' adlanan müşahidələrin əksəriyyətinə başqa birində 'klaster 2' deyilirsə, nəticələrin hələ bir-birinə bənzər olduğunu görərik. Bizim vəziyyətimizdə, müxtəlif qruplar əsasən çox sabitdir və hər dəfə yalnız tam əlaqəli iyerarxik qruplaşma fərqləndikdə eyni müşahidələri eyni qruplara qoyur:

Əlbəttə ki, hər hansı bir klaster analizinin məlumatlarınızdakı əsl gizli qrupları bərpa edəcəyinə zəmanət yoxdur. Həqiqi klaster etiketlərinin olmaması (məsələn, lojistik reqressiya vəziyyətində mövcud ola bilər) çox miqdarda məlumatın əlçatan olmaması deməkdir. Çox böyük məlumat dəstləri ilə belə, klasterlər mükəmməl bərpa edilə bilməsi üçün kifayət qədər yaxşı ayrılmamış ola bilər. Bizim vəziyyətimizdə, həqiqi klaster üzvlüyünü bildiyimiz üçün bunu nəticə ilə müqayisə edə bilərik. Yuxarıda qeyd etdiyim kimi, həqiqətən 3 gizli qrup var, lakin məlumatlar bunun yerinə 2 qrupun görünüşünü verir:


12 Cavablar 12

Yaxşı sual! Həmişə olduğu kimi kiçik ekran təcrübələrindən danışarkən əsas funksionallığa diqqət yetirməli olacaqsınız. Özünüzdən hansı sütunların silinə biləcəyini soruşun və yenə də mənfi bir masa təqdim edin və istifadəçiyə maraqlı olan əlavə sütunları seçməsinə icazə verin.

Əsasən artıq deyilənləri tövsiyə edir: yalnız vacib sütunlardan istifadə edin.

. və istifadəçiyə hansı sütunları göstərəcəyinə qərar vermək seçimi verin.

Məqalənin yaxşı tərəfi bəzi kodlar atmaqdır.

Verilərin yalnız bir neçə sütunla məhdudlaşa bilməyəcəyini söylədiyiniz üçün interfeys dizaynına rəhbərlik etmək üçün bir neçə heuristika təklif edirəm.

Birincil sütundan başlayın, qalanları ikincidir
Ən solda olmaq üçün açar sütununuzu seçin: istifadəçilər əvvəlcə identifikator kimi axtarırlar? Budur mövzu. Sonra ən vacib marjaya baxın: istifadəçilər əvvəlcə dəyişikliyə nəyi axtarırlar? Statusun yaxşı bir namizəd olduğunu düşünək, çünki istifadəçilər bu dəyişiklikləri axtaracaqlar.

İstifadəçilərin üfüqi hərəkət etməsinə icazə verin
Bunu iki sütunla məhdudlaşdıra bilməyəcəyinizi söylədiyiniz üçün istifadəçilərə sağa və ya sola, bir dəfəyə bir sütuna keçməsinə icazə verin. Ancaq bir sütun həqiqətən əsasdırsa, onu kilidləyin və yalnız digər sütunu sürün (Excel və ya Google danışıq səhifələrində olduğu kimi).

İstifadəçilərin sütun prioritetini yenidən sıralamasına icazə verin
Sütun prioriteti, soldan sağa hansı sütunların göründüyünü təyin edir. Açar sütun ətrafında seçiminizə əsaslanan bir default ilə başlayın, ancaq onları yenidən sıralamalarına icazə verin. Sonra müvafiq olaraq göstərin.

Digərləri
Sütunu sıralamaq üçün sütun başlıqlarını tıklanabilir olun. İnsanların yuxarı hissəyə filtrlər əlavə etməsinə icazə verin.

Təqdim etdiyiniz ssenaridə hərtərəfli araşdırıldıqda qərarınızı asanlaşdıracaq bir neçə zəmin var.

1 Məlumat cədvəllidir.

Sənədləri sorğudan geri qaytardığınız və standart olaraq cədvəldə göstərdiyiniz üçün məlumatları interfeys baxımından "cədvəlli" etmirsiniz. Əsas cədvəlli ekranın əsas funksiyasıdır müqayisə et bir və ya daha çox maddə xüsusiyyətlərinə görə çoxlu set maddələri. Məlumatların analizini düşünün. Cədvəllərdə qruplaşdırma və çeşidləmə, məlumatların təhlilini tək bir cədvəldən istifadə etməklə asanlaşdıran, lakin müqayisənin əsas funksiyasına ikinci dərəcəli olan rahatlıq seçimləridir.

Siyahılar ümumiyyətlə bir neçə əsas xüsusiyyətə əsaslanaraq bir və ya bir neçə maraqlı maddəni tapmaq üçün bir sıra məlumatların göstərilməsinə daha uyğun gəlir. Verilənlərin siyahısını çeşidləmək və qruplaşdırmaq, yaxşılaşdırılmış "tapıla bilmə" üçün maraq doğuran maddələrin siyahının üstünə çıxmasını asanlaşdırır. Sıralanmış siyahılar bir və ya daha çox xüsusiyyətə görə çeşidlənməyi nəzərdə tutur və qruplaşdırma çoxsaylı ardıcıl siyahılar və ya alt siyahılarla həyata keçirilir.

Mənim fikrimcə, əlaqələndirdiyiniz məlumatlara ciddi bir baxışa əsaslanaraq, məlumatlarınız üçün istifadənin daha çox müqayisə olunduğunu və ya tapdığını soruşmaq istəyə bilərsiniz.

2 Mobil istifadə vəziyyəti, masa üstü istifadə vəziyyəti ilə kökündən eynidir

Bu, yalnız "cavab vermək" qərarının əsasında duran böyük sualdır. Həssas dizayn, əvvəlcə eyni məlumatları fərqli ekran ölçülərində əks etdirən (əsasən) müraciət edir. Bəzi hallarda, mobil istifadə vəziyyəti [kontekst, istifadəçi hədəfləri, məlumat ehtiyacları] masa üstü ehtiyacından kifayət qədər fərqlidir ki, həssas bir həll, bir (və ya daha çox) istifadəçi dəsti üçün qəbuledilməz səviyyədə uzlaşmaya məcbur edir. Bu baş verdikdə fərqli bir mobil həll daha yaxşı bir seçimdir.

Sizin vəziyyətinizdə, istifadə vəziyyətlərinin eyni olub-olmamasına və ya fərqli təcrübələrin dizaynının daha yaxşı uyğun olub-olmamasına əvvəlcə qərar verərdim. Eyni olduqda, "cədvəlli" məlumatların istifadə vəziyyətini araşdırın. Əsasən maddə (lər) tapmaqdırsa, siyahı əsaslı bir həll yolu ilə gedin və çeşidləmə / qruplaşdırma seçimlərindən istifadə edin və potensial olaraq siyahı elementlərini (bəlkə də yalnız mobil telefonlarda) çökdürün / genişləndirin.

Əgər istifadə halları eynidirsə və birdən çox maddənin xüsusiyyətlərinə görə müqayisə edilməsi məlumatların göstərilməsinin əsas məqsədi olarsa, məlumatları silmək və ya gizlətməklə cədvəlin 320px-ə uyğunlaşdırılması əslində daha pis istifadəçi üçün tam masanın üzərində üfüqi böyütmək və / və ya daha çox sürüşdürməkdən daha çoxdur. Bu ssenaridə tam cavab verən dizayn uyğun deyil.


Kiçik şəkil:

Daha böyük bir seçmə ölçüsünün varyansı necə azaltacağını anlamıram.
Yalnız nümunə dispersiyasını hesabladığınızı və normal bir paylanmada parametr olaraq istifadə etdiyinizi düşünürəm.

Çalışdım:

  • googling, lakin qəbul edilən cavabların əksəriyyətində 0 səsvermə var və ya sadəcə nümunələrdir
  • düşünmək: Böyük rəqəmlər qanununa görə hər bir dəyər, ehtimal etdiyimiz normal paylanmaya görə ehtimal olunan dəyər ətrafında sabitləşməlidir. Və bu səbəbdən varyans, qəbul etdiyimiz normal paylanmanın varyansına yaxınlaşmalıdır. Ancaq bu normal paylanmanın fərqi nədir və minimum dəyərdir, yəni nümunə fərqimizə əmin ola bilərik azalır bu dəyərə?

Verilənlər Bazası Bağlantısı Xəta Hekayələrini Paylaşın!

Veb saytınızdakı bu ümumi məsələ ilə məşğul olmusunuz? Necə düzəltdin? Problemin tam olaraq nəyə səbəb olduğunu müəyyənləşdirdiniz? Sorun giderme tövsiyələrinizi aşağıda paylaşın!

Tomnamon / Shutterstock.com tərəfindən kiçik şəkil

KeriLynn Engel tərəfindən

KeriLynn Engel bir kopirayter və amp məzmun marketinq strateqidir. Hədəf auditoriyasını cəlb edən və çevirən yüksək keyfiyyətli məzmun planlaşdırmaq və yaratmaq üçün B2B & amp B2C müəssisələri ilə işləməyi sevir. Yazmadıqda, spekulyativ fantastika oxuduğunu, Star Trek seyr etdiyini və ya yerli açıq mikrofonda Telemann fleyta fantaziyalarını oynadığını tapa bilərsiniz.


6 Cavablar 6

$ Dfrac <3 times 10 ^ <14>> <52!> $ Orijinal cavabınız doğru olmaqdan uzaq deyil. Əslində kartların istənilən sifarişinin gözlənilən sayıdır.

İlkin fərziyyələrinizi nəzərə alaraq kartların hər hansı bir sifarişinin baş verməməsi ehtimalı $ left (1- frac1 <52!> Right) ^ <(3 times10 ^ <14>)> $ və baş vermə ehtimalı bu mənfi 1-dir. Ancaq $ n epsilon $ kiçik dəyərləri üçün $ (1+ epsilon) ^ n $ təxminən $ 1 + n epsilon $ -dır. Xüsusilə $ 52! Yaklaşık 8 times 10 ^ <67> $ və beləliklə $ dfrac <3 times10 ^ <14>> <52!> Yaklaşık 3.75 times 10 ^ <-54> $ mikroskopik baxımdan kiçikdir , $ 1- left (1- frac1 <52!> Right) ^ <(3 times10 ^ <14>)> $ təxminən $ frac1 <52!> Times (3 times10 ^ <14> ) $.

52 dollarlıq kartların göyərtəsi üçün $ 52! $ Mümkün sifariş var. Böyük partlayışdan bəri hər saniyədə $ 52 $ unikal kartların bənzərsiz bir əmri yaradılmışdısa, hər ikisinin təkrarlanması şansı $ 1- (1-1 / 52!) ^ <(10 ^ < 17>)> = 1.2397999 times10 ^ <-51> . $ Bu ədədin ölçüsünü göstərmək üçün, eyni planetin hər saniyədə təxmin edilən $ 10 ^ <24> $ ulduzların hər birinin ətrafında dövr etdiyini düşünək. zamanın başlanğıcından bəri bilinən kainatda. Bu sifarişlərin hamısının misilsiz olma ehtimalı hələ də $ 99.999999999999999999999999876 \% . $ Go kartların göyərtəsini altı dəfə qarışdırın və həqiqətən misilsiz bir şey yaradın!

Göyərtəni qarışdırıb permutasiya p əldə etdik. Hər əvvəlki qarışdırmaq üçün 1-1 / 52 var! p-nin ona uyğun gəlməməsi ehtimalı. Əvvəlki hər bir qarışıqlıq müstəqildir, çünki p və digər permutasiyaların nə olmasından asılı olmayaraq, qarışdırmaqla uyğunlaşma şansı 1-1 / 52-dir! Ehtimallar müstəqil olduqda, baş verən bütün hadisələrin şansını tapmaq üçün onları çoxalda bilərik. Bu vəziyyətdə, hər bir hadisə əslində bir uyğunluqdur yox baş verir, buna görə əvvəlki n qarışıq verildiyi təqdirdə matçın olmaması şansı (1-1 / 52!) ^ n. Bundan sonra hesablamaları Michael kimi tamamlaya bilərik.

Fərziyyələrinizi şübhə altına almaqda haqlısınız və verdiyiniz düsturun ($ n = $ qarışıqlıq sayı / $ N = $ mümkün qarışıq sayı) düz olmadığı barədə olduqca düz (başqalarının da qeyd etdiyi kimi), ancaq ad günü paradoksundan fərqli olaraq burada fərq işləyir aşağı matç şansını artırmaq deyil. Kiçik rəqəmlərlə işləmək intuisiyaya bir az kömək edir: $ N = $ 20 tərəfli bir ölünün $ n $ rulonlarının olduğunu düşünək və əvvəlki rulonlara bir matç vurmaq şansınızın nə olduğunu bilmək istəyirsiniz. Sonra kiçik $ n $ üçün ağlabatan bir ilk təxmini bir uyğunlaşma ehtimalının $ n / 20 $ olmasıdır: bu, $ n = 0 $ və $ n = 1 $ üçün doğrudur və $ -ın "intuisiyasına" uyğundur. n $ qarşı əvvəlki rulonlarda. Ancaq $ n = 20 $ -a qədər olan zərbə, 20 rulondan sonra təxminin parçalanmasını göstərir, əmsalınız onsuz da bir dəfə yuvarlanan ədədin yuvarlanmasının 100% -i deyil və 21 rulondan sonra onlar əlbəttə ki deyil daha böyük 100% -dən çox!

Buradakı qüsur, əlbəttə ki, $ n $ rulonlardan sonra əvəzinə $ n $ unikal nömrələr yuvarlanmayacaqdır, ehtimal ki, bəzi dublikatlar var. Ancaq ehtimal haqqında bu şəkildə düşünməkdən də aydın olur ki, növbəti qarışıqdakı (və ya rulondakı) qarşılaşma ehtimalı olmalıdır Əvvəlki qarışmalar unikal olsaydı, ehtimalların olacağından az olsun və istifadə etdiyiniz $ n / N $ yaxınlaşmasından az olmalıdır ($ n = 3 times 10 ^ <14> $ və $ N = ilə 52! $).

(Doğum günü paradoksuna 'paradoksal' mahiyyətini izah edən nisbətən intuitiv bir yol var, orada bir şeyi $ n $ ilə yox, $ n $ şeyləri bir-birinə uyğunlaşdırmağa çalışmırsınız - buna görə istifadə üçün düzgün kəmiyyət $ n $ deyil, bunun əvəzinə mümkündür $ n (n-1) / 2 təqribən n ^ 2/2 $ eşleşir, hər biri (heuristically) ilə $ 1 $ ilə $ N $ arasında həqiqətən uyğunlaşma şansına sahibdir, buna görə bir dəyər üçün bir matç gözləməyə başlaya bilərsiniz. $ n $ ilə $ sqrt ilə mütənasibdir$ N $ ilə nisbətdə olan $ n $ dəyəri üçün $ deyil.)


10 cavab

Nəyi geri aldığınızı və bunları kodunuzdakı dəyişənlərə necə bağladığınızı düşünün.

İndi düşünün ki, kimsə birbaşa istifadə etmədiyiniz bir sütun da əlavə etmək (və ya silmək) üçün cədvəl şemasını yeniləyir.

Sorğuları əl ilə yazarkən select * istifadə etmək yaxşıdır, kod üçün sorğu yazarkən yox.

Şema dəyişiklikləri

  • Sifarişlə alın --- Kod məlumat əldə etməyin yolu olaraq # sütunu götürürsə, sxemdəki dəyişiklik sütun nömrələrinin yenidən tənzimlənməsinə səbəb olacaqdır. Bu tətbiqi qarışdıracaq və pis şeylər olacaq.
  • Adla alın --- Kod foo kimi adla sütun alırsa və sorğudakı başqa bir cədvəl foo sütun əlavə edərsə, bunun işlənmə qaydası problemi yarada bilər. sağ foo sütunu.

Hər iki halda da, bir sxem dəyişikliyi məlumatların çıxarılması ilə əlaqədar problemlərə səbəb ola bilər.

Daha sonra istifadə olunan bir sütunun olub olmadığını düşünün silindi masadan. * Seçin. hələ də işləyir, lakin məlumatları nəticə dəstindən çıxarmaq istəyərkən səhvlər olur. Sorğuda sütun göstərildiyi təqdirdə sorğu problemin harada və nə olduğuna dair dəqiq bir ciddilik vermək əvəzinə səhv edəcək.

Məlumat yükü

Bəzi sütunlarda onlarla əlaqəli əhəmiyyətli miqdarda məlumat ola bilər. Geri * seçib çəkiləcək hamısı məlumat. Həəəəəəəəəəəəəəəəəəəəə ləəayə əlavə 4 meqabayt məlumat verərək geri seçdiyiniz 1000 cərgədə olan varchar (4096), ancaq hər halda telə göndərilir.

Şema dəyişikliyi ilə əlaqədar olaraq, cədvəli ilk dəfə yaratdığınız zaman varchar orada olmaya bilər, amma indi var.

Niyyəti çatdıra bilməmək

Geri * seçib 20 sütun aldıqda ancaq bunlardan yalnız 2-nə ehtiyacınız olduqda, kodun məqsədini çatdırmırsınız. Seçim edən * sorğuya baxarkən, bunun vacib hissələrinin nə olduğunu bilmir. Sorğunu bu sütunları daxil etmədən daha sürətli etmək üçün əvəzinə bu digər planı istifadə etmək üçün dəyişdirə bilərəmmi? Bilmirəm, çünki sorğunun nəyin qaytaracağı niyyəti aydın deyil.

Bunları araşdıran bəzi SQL fiddllərinə baxaq şema dəyişiklikləri bir az daha.

Geri qaytardığınız sütunlar oneid = 1, data = 42, twoid = 2 və digəri = 43.

İndi cədvələ bir sütun əlavə etsəm nə olar? http://sqlfiddle.com/#!2/cd0b0/1

Və əvvəlki ilə eyni sorğudan əldə etdiyim nəticələr oneid = 1, data = 42, twoid = 2 və digər = foo.

Cədvəllərdən birindəki dəyişiklik bir seçimin * dəyərlərini pozur və birdən-birə 'digərini' bir int ilə bağlamağınız bir səhv atacaq və bunun səbəbini bilmirsiniz.

Bunun əvəzinə SQL ifadəniz olardı

Bir cədvəldəki dəyişiklik məlumatlarınızı pozmazdı. Bu sorğu dəyişiklikdən əvvəl və dəyişiklikdən sonra eyni işləyir.

İndeksləşdirmə

Bir seçim * etdiyiniz zaman özünüzdən çəkirsiniz hamısı satırlar əmələ gəlir hamısı şərtlərə uyğun masalar. Həqiqətən maraqlandığınız masalar belə. Bu daha çox məlumatın ötürülməsi demək olsa da, yığının altından gizlənən başqa bir performans problemi var.

Bir çox sütunu geri çəkirsinizsə verilənlər bazası planı optimizatoru bilər indeksdən istifadə etməməyə diqqət yetirin, çünki yenə də bütün bu sütunları gətirməyiniz lazım olacaq və indeksdən istifadə etmək, daha sonra sorğudakı bütün sütunları almaq üçün tam bir masa taraması etməkdən daha çox vaxt lazımdır.

Yalnız bir istifadəçinin soyadını (çox etdiyiniz və bunun üzərində bir indeksin olduğu) seçsəniz, verilənlər bazası yalnız bir tarama edə bilər (postgres wiki indeksi yalnız tarama, mysql tam masa taraması vs tam indeks taraması, Yalnız İndeks Taraması: Cədvələ girişdən qaçınmaq).

Mümkünsə yalnız indekslərdən oxumaqla bağlı bir az optimallaşdırma var. Məlumat hər bir indeks səhifəsində daha sürətli çəkilə bilər, çünki daha azını da çəkirsiniz - seçim üçün digər sütunların hamısını çəkməmisiniz. Yalnız bir indeks taramasının nəticələrini 100x sırasına gətirməsi mümkündür Daha sürətli (mənbə: Seç * pisdir).

Bu, tam bir indeks taramasının əla olduğunu, hələ də tam bir tarama olduğunu söyləmir - ancaq tam bir masa taramasından daha yaxşıdır. Seçdiyiniz * performansa zərər verən bütün yolları təqib etməyə başladıqda yeniləri tapmağa davam edirsiniz.

Əlaqəli oxu

Başqa bir narahatlıq: bir QOŞUL sorğusudursa və sorğu nəticələrini assosiativ bir sıra halına gətirirsinizsə (PHP-də olduğu kimi), səhvlərə meylli olur.

  1. cədvəl foo sütun id və ad varsa
  2. cədvəl çubuğunun id və ünvanı sütunları varsa,
  3. kodunuzda SELECT * FROM foo JOIN bar ON foo.id = bar.id istifadə edirsiniz

kimsə bar masasına bir sütun adı əlavə etdikdə nə baş verdiyini təxmin edin.

Kod birdən-birə düzgün işləməyi dayandıracaq, çünki indi nəticələrdə ad sütunu görünür iki dəfə və nəticələri bir sıra içərisində saxlayırsınızsa, ikinci addan məlumatlar (bar.name) adın (foo.name) üstünə yazacaq!

Olduqca pis bir səhvdir, çünki çox açıq deyil. Anlamaq biraz vaxt ala bilər və masaya başqa bir sütun əlavə edən şəxsin bu cür arzuolunmaz yan təsiri gözləməsi üçün bir yol yoxdur.

Beləliklə, * istifadə etməyin, hansı sütunları götürdüyünüzə nəzarət edin və lazım olduqda ləqəblərdən istifadə edin.

Hər sütunun sorğusu bir çox halda tamamilə qanuni ola bilər.

Həmişə hər sütuna sorğu vermək olmur.

Verilənlər bazası mühərrikiniz üçün daha çox işdir, hansı ki, məlumat əldə etmək və sizə geri göndərmək həqiqi işinə başlamazdan əvvəl hansı sütunlarla məşğul olması lazım olduğunu öyrənmək üçün daxili meta məlumatlarını söndürməli. Tamam, bu dünyanın ən böyük xərci deyil, amma sistem kataloqu nəzərəçarpacaq bir problem ola bilər.

Şəbəkəniz üçün daha çox işdir, çünki geri çəkilirsiniz hər hansı bir nömrə onlardan yalnız birini və ya ikisini istəyə biləcəyiniz sahələrdən. Biri [başqa] gedib bir neçə ondan çox əlavə sahə əlavə etsə, hamısı böyük mətn parçaları içərisindədirsə, siz birdən-birə zəmindən keçirsiniz, heç bir səbəb olmadan. Bu, "harada" bəndiniz xüsusilə yaxşı deyilsə və bir çox sətirləri geri çəkirsinizsə, bu daha da pisləşir - bu, potensial olaraq bir çox məlumatın şəbəkə boyunca sizə keçməsini təmin edir (yəni yavaş olacaq).

Tətbiqiniz üçün daha çox işdir, ehtimal ki, əhəmiyyət vermədiyi bütün bu əlavə məlumatları geri çəkib saxlamaq lazımdır.

Sütunların sırasını dəyişdirmə riski var. OK, bu barədə narahat olmamalısan (və sən də) olmaz yalnız sizə lazım olan sütunları seçsəniz), ancaq hamısını birdən əldə etsəniz və kimsə [başqa] cədvəldəki sütun sırasını yenidən düzəltməyə qərar verərsə, diqqətlə hazırlanmış, hesaba verdiyiniz CSV ixracı birdən-birə gedir hamısı qazana - yenə də asanlıqla görünən bir səbəb olmadan.

BTW, yuxarıda bir-iki dəfə "başqası" dedim. Veritabanlarının öz-özlüyündə çox istifadəçi olduğunu unutmayın, düşündüyünüz şeylərə nəzarət edə bilməyəcəksiniz.


Do-while performansı

Do-while performansı çox aşağı təsir göstərir. demək olar ki, əhəmiyyətsizdir. Bu, çox müzakirə olunur, amma həqiqət budur ki, problem yaranmazdan əvvəl çox və çox saymağa ehtiyacınız olacaq. Səbəb belədir:

Çarpışmalar təsadüfi dəyər əvvəllər seçildikdə baş verir. Müəyyən edilmiş [0 .. Int32.MaxValue) aralığında, toqquşmalar əslində baş vermədən əvvəl çox böyük bir saymaya ehtiyacınız olacaq. Məsələn, tək bir toqquşma ehtimalı% 50-dən daha yaxşı olmasınca say sayının təxminən 65.000 olması lazım idi.

Ümumi mənada $ N $ aralığı verildikdə $ M $ ədədlərini seçin. $ M & lt sqrt $ onda tək bir toqquşma ehtimalı & lt% 50-dir. Range çox böyük olduğundan ehtimal azdır.

Aydındır ki, aralıq kiçik olsaydı, ehtimallar əhəmiyyətli dərəcədə təsir edərdi. Lakin aralıq Int32.MaxValue-da düzəldilmişdir, buna görə yaxşıdır.

Əlavə olaraq, sayma böyük olsaydı, ehtimallar da təsir edərdi. Nə qədər böyük olar? Bəli, əhəmiyyətli problemlərə başlamazdan əvvəl çox böyük massivlərdə çalışacaqsınız. $ Frac-a yaxın vurduğunuzu düşünürəm<2> $ performansla əlaqədar əhəmiyyətli bir problemə başlamazdan əvvəl.

Siyahı performansı

Bu, şübhəsiz ki, ən böyük narahatlıqdır. Bir dəyərin əvvəlcədən seçilib seçilmədiyini təyin etmək üçün randomNumbers.Contains (number) zəngindən istifadə edirsiniz. Bunun üçün əvvəlcədən seçilmiş bütün dəyərlərin taranması lazımdır. Qeyd edildiyi kimi, bu, demək olar ki, həmişə yanlış olaraq dönəcək və beləliklə bütün siyahını taramalı olacaq.

Sayma dəyəri artdıqca, Contains-in yerinə yetirilmə müddəti kvadrat sürətlə artacaq, $ O (n ^ 2) $ burada n sayılır.

Bu performans problemi təsadüfi toqquşma problemindən daha tez kritik olacaqdır.


Xülasə

Probleminizlə bağlı onsuz da mövcud olan məlumatları toplamaq və onu həll etməyə çalışmaq bir proqramın və ya qiymətləndirmənin planlaşdırılmasının ən vacib tərəflərindən biridir. Məsələ ilə bağlı bilinənləri və ona müxtəlif yanaşmaların uğurlu və uğursuzluqlarını tarixçəsini bir araya gətirərək, öz yeniliklərinizi və oxşar vəziyyətlərdə başqaları üçün işləyən elementləri özündə cəmləşdirən bir proqram qura bilərsiniz. Bu sintez həm də təsirsiz yanaşmalardan çəkinməyə və birlikdə işlədiyiniz əhali və icmaya mədəni və ya başqa şəkildə uyğun fikir və metodları daxil etməyə imkan verir.

Məlumat toplama və sintez proqramın davam etdiyi müddətdə davam etməlidir. Nə qədər çox məlumat varsa və onu bir o qədər diqqətlə bir araya toplasanız, uğurlu bir proqramı həyata keçirmək şansınız o qədər yüksəkdir.


Videoya baxın: İlah sözünün mənası (Sentyabr 2021).