Korzystając z PostgreSQL 9.4 mamy prostą tabelę kontaktów z (tekstem id nie null (jak pk), blob json) do eksperymentowania z portowaniem bazy danych couchdb crm. W końcu podzielimy się na więcej kolumn itd., A dane będą przetwarzane bardziej idomatycznie dla rdbms, ale na razie jest to poza tym punktem.Postgresql Offset Behavior z kolumną json
Istnieje około 100 tys. Wierszy.
Zdaję sobie sprawę, że eksperci skuteczności Hardcore postgresql odradzam offsetowego jednak mogę zaakceptować niewielką karę wydajności (szczęśliwy z niczego mocy 100 ms)
SELECT id FROM couchcontacts OFFSET 10000 LIMIT 10
Jak oczekiwano trwa < 10ms
SELECT blob->>'firstName' FROM couchcontacts LIMIT 10
Zajmuje także < 10ms (przyjmuj 10 błędów dekodowania json na kolumnie blob tutaj)
SELECT blob->>'firstName' FROM couchcontacts OFFSET 10000 LIMIT 10
Trwa w górę z 10 sekund !! Zauważalne są nieefektywności przesunięcia na bok, dlaczego to prawdopodobnie powoduje 10 010 dekodowania jsonów? Ponieważ projekcja nie ma skutków ubocznych, nie rozumiem powodu, dla którego to nie może być szybkie?
Czy to ograniczenie funkcji json jest względnie nowe w postgresie? i w ten sposób niezdolny do określenia openeratora ->>
nie powoduje skutków ubocznych?
Ciekawe przepisywania zapytań do tego doprowadzić go z powrotem pod 10milliseconds
SELECT jsonblob->>'firstName' FROM couchdbcontacts WHERE id IN (SELECT id FROM couchcontacts OFFSET 10000 LIMIT 10)
Czy istnieje sposób, aby zapewnić przesunięcie robi json dekodowania offsetted rekordy? (tj. nie wykonuj projekcji select)
"Limit (cost=1680.31..1681.99 rows=10 width=32) (actual time=12634.674..12634.842 rows=10 loops=1)"
" -> Seq Scan on couchcontacts (cost=0.00..17186.53 rows=102282 width=32) (actual time=0.088..12629.401 rows=10010 loops=1)"
"Planning time: 0.194 ms"
"Execution time: 12634.895 ms"
To wygląda jak szorstki zakątek tej nowej funkcji. Proszę zgłosić to jako błąd do PostgreSQL. Domyślam się, że obejście to jest ręcznym przywołaniem, tak jak pokazałeś się. – Thilo
"WYJAŚNIJ ANALIZĘ", proszę? Nie jestem całkowicie przekonany wyjaśnieniem rozbieżności. Czy stworzyłeś profil/'perf top'/etc, aby sprawdzić, czy twoje hipotetyczne wyjaśnienie pasuje do zaobserwowanego zachowania? Choć w mgnieniu oka ... Myślę, że jeśli poprosisz o zestaw wyników z przesunięciem, PostgreSQL powinien oceniać wyrażenia w odrzuconych wierszach, chyba że może udowodnić, że nie mają żadnych skutków ubocznych. Więc może to jest ocena wyrażeń json ... i prawdopodobnie powinno to być, chyba że może udowodnić, że nie mogą przerwać zapytania z 'ERROR' lub zmienić stan bazy danych. –
Biorąc pod uwagę - >> jest wbudowany operator, nie powinien postgresql wiedzieć, że to nie powoduje skutków ubocznych? czy istnieje sposób na wskazówkę, że to nie powoduje efektu ubocznego? Zaktualizowano analizując objaśnienia –