<bgdev />free

| |  


All tags 2023 9may ai algorithm alpha amd american api argon2 arm asm asmbb assembler attachment awareness balgaria bay888 bcrypt bender beta bgdev-next bgdev-next.👍 big.data bitchnigga bitcoin bmw boi borg brexit bug bulgaria business c cad chat cloud computer-names console crossorigin deprivation desktop dna dotnet email eupl falling feature forum foundation fp fresh fun game gcc github goats google gpl gpt gpt.3.5 gypsies happiness harvard hash improvement include investment it java javascript js kleta kleta.maqka.balg lambi language learning leftovers legend level levenshtein.dist libx license linkedlist linux m0 ma mcafee mele microsoft minimag minimalism negro net nginx nigga not.a.bug oop paradigm parler patterns perception persuasion pipe play.station politics populi pornhub pow pro programming protonmail python reba rust sci-fi scripting seks seo server shell sleep smartbeauty soft-skills sqlite srabska sse starship sugerface syntax tablet tailwindcss telegram theme thug troll80lvl tutanota typescript uacme ui uk unix untermensch upload uptime usa utilities ux vb via viber virtual.reality vox vps vulnerable war wasm weapons-grade web windows word x86 xbox xss youtube zig ziglang Übermensch БОКЕБЪЛГАРИН БЪ БЪлгария Белезниците Били Били.Белезниците БялДонор Веган Виста Възраждане ГЛУПАК Гана Глиста ЕС Казарма Копейкин Мода.и.овча.мисъ НЕКАДЪРНИК НРБ ПО-ЗЛЕ.И.ОТ.РАБИ Подкасти Разни Румен СИК СКУМ СетенЧук Скум ТИР Туче Украйна Урсула Яначков авангард аз айфонджия алгоритми амбиции анархизъм антиваксъри армения аудио аутисти бази.данни бакъп без без.пръчове безпросвета бенчмарк биготи биомаса бира боклук борисов ботев брадва булшит бъг бъгове бял ваксина вандал век венерика викинги вицове вишу война вървежен гана ганорник гей гейщина германия герои гешев глупак говеда групировка гюбек данъкоплатец двойни.стандарти дедотия демокрация дизайн дисциплина добитък докери долар донори држава дришльо дрон ебане еврогейски.съюз езици експеримент електроника електроника.s2 емиграция ендпойнт енум ерген ергономия жалкар задача затоплизъм защита здраве златен злато игри идеали идиократ идиократи идиокрация идиот избори избори.рабин изкуство икономика имбецили имейл инвестиране инокулация инструмента интервю ипад искам.да.си.реда казах камшикодържач капитализъм карабах караница картечница кино клавиатура ковид19 колайдер колям.кур комари комплексар комунизъм консолидация конспирации космонавтика кофа кофит-19 краставица криптовалути курви кучелюбци лайно лаладжия лаптоп либерастия литература лоши.практики луд лъжеучени лъжец любов майни майтапи малоумници мафия мениджмънт месо местене метавселена метафизика механика мистика мисъл мода мода.овча.мисъл модерация морал мутра мутри наука национализъм не.it негър некадърник некадърници неон нидерландия овча овчи олигофрени организация офтопик парички партия педал пенджури пенсия пишока плюскане победа погромист поезия политика порно посредствен почивка празници прасе превод предалщина програмиране проект проста простотии против.правилата проф пръч пръч.дришльо пръчка психика психични.болести психология пустиняк путин путката путьо рабин рабин.е.шибан.пе работа радост разврат разни разработка расизъм резерват рейтинг реклама рекламен религия рест ризи ропче ропчета русия руски.език рутина самоковска сасипаха секира село селяндур сериали сериозно.програм сетен сеянин симулация скопяване скръм слушалки сортиране софия софтуер софтуни социализъм спектрометър спринтове сране стандарти стил стуйо стюи сушилня сцена съвет съм сън сървър сърничка таб ташаци телевизия тема територията терминология термояд технологии титли традиция тролинг тръмп туба туче тъпак тъпанари тъпня уиндоус украйна умнокрасивци фалит фантастика фашизъм фейк.акаунти физика филми форум форумни.проекти футбол хазарт хамали харабия хардуер хахаха хомофобия хостинг храна хумор цайко цайси целофан цензура цензурра циганин чалга чалгар чекии чернокраки честота чипове чнг чужбина чук шпация щайга юан яката яко ям 🔨 😂 🪓


Една особеност на SQLite

  


  johnfound  Създадено на 27.10.2020, видяно: 1379 пъти. #17007

Вчера открих един ефект при SQLite, който се среща рядко, но може сериозно да намали производителността на заявките.

Ето тестов пример:

create table t1(a text unique);
create table t2(b integer);

explain query plan
select 
  *
from 
  t2 left join t1 on a = b;

Това дава следния план, въпреки, че на t1.a има прекрасен индекс (щото е UNIQUE), той не се използва:

SCAN TABLE t2
SCAN TABLE t1

Предполагам, че това се дължи на това, че оптимизаторът, като види, че b е integer, преобразува и a в integer, а съществуващият индекс е текстов. За да бъде използван този индекс, заявката следва да бъде написана така:

select 
  *
from 
  t2 left join t1 on a = cast(b as text);

Тогава планът е следния:

SCAN TABLE t2
SEARCH TABLE t1 USING COVERING INDEX sqlite_autoindex_t1_1 (a=?)

И съответно скоростта на заявката е сериозно по-висока.

Малко ми е трудно да кажа дали това е бъг или особеност на оптимизатора на заявките, тъй като типовете в SQLite са само пожелания, но не и твърдо правило, а в едно поле на таблиците могат да се записват данни от произволен тип. Тоест, оптимизаторът следва на има това предвид и да използва най-добрият вариант на заявката.

Ще питам DRH и ако има някакво обяснение ще пиша в темата.



  bvbfan  Създадено на 27.10.2020, видяно: 1372 пъти. #17010

Особеността е по-скоро се ползва само 1 индекс, т.е. той може да не е най-оптималният. Затова може да ползваш в заявката


INDEXED BY <индекса>


  johnfound  Последно редактирано на 27.10.2020 от johnfound, видяно: 1370 пъти. #17012
bvbfan

Особеността е по-скоро се ползва само 1 индекс, т.е. той може да не е най-оптималният. Затова може да ползваш в заявката


INDEXED BY <индекса>

Не, това беше първото, което опитах. Но не работи. По две причини. Първо, индексът на unique поле е автоматичен и затова не му знаеш името.

Разбира се, можеш да го намериш или да създадеш явен индекс, но това ще е текстов индекс, а в израза a = b явно и двете страни се преобразуват в integer.

Съответно, в резултат дава грешка: no query solution;



  johnfound  Създадено на 27.10.2020, видяно: 1332 пъти. #17055

Някои неща се изясниха, в резултат на обсъждането на форума на SQLite.

Номерът се състои в това, как SQLite каства изразите. Реално в SQLite няма типове данни, а има т.н. affinity - афинитет, сходство. Тоест, ако някакво поле е обявено като integer, то в него може да се запише и стринг и блоб, но базата предполага, че в него има записано число и си планира заявките от това предположение.

Също може да има полета и без афинитет.

Та така, когато има израз от вида a = b, то двете страни трябва да се приведат към еднакъв тип. И тогава се гледат афинитетите на величините от двете страни на сравнението.

Ако едната страна има числен афинитет, то всичко се преобразува към него. Ако едната страна няма афинитет, то всичко се преобразува към другата.

Възможен е и трети вариант, в който нищо не се преобразува – когато никоя от двете величини няма никакъв афинитет. Как става сравнението в този случай на мене не ми е много ясно, но документацията твърди именно това.

Тоест във въпросният пример, става следното – лявата и дясната страна на сравнението се преобразуват в числен вид, тъй като едното поле е обявено като integer. И тъй като индексът на другото поле е текстов, то той не може да се използва.

А когато полето с числов афинитет се преобразува явно в text, то и афинитета му се променя и сравнението става във текстова форма, в която може да се използва и съществуващия индекс.

Лично според мене, големият проблем е, че всичко това е доста неинтуитивно. Но, каквото такова.

Поуката е, че трябва често да се използва explain query plan и да се обмислят внимателно резултатите. :-)



  ФейкПрофил  Създадено на 28.10.2020, видяно: 1310 пъти. #17073

аз лично не бих си помислил да джойнвам по полета от различен тип



  johnfound  Създадено на 28.10.2020, видяно: 1304 пъти. #17074
ФейкПрофил

аз лично не бих си помислил да джойнвам по полета от различен тип

Да, ама в SQLite въобще няма типове на полетата. Там не е проблем в едно поле да запишеш каквито и да е данни и те няма да бъдат преобразувани, а ще се запишат в таблицата такива, каквито са.

В този смисъл, всеки джойн е по полета с различен тип.



Една особеност на SQLite

  



AsmBB v3.0 (check-in: 7544654b24928b93); SQLite v3.47.0 (check-in: 03a9703e27c44437);
©2016..2024 John Found; Licensed under EUPL; Powered by Assembly language Created with Fresh IDE