Wpis z mikrobloga

#aspnet #bazydanych #csharp #dotnet #entityframework #linq #postgresql #programowanie #sql
W jaki sposób z bazy danych pobrać X wierszy starszych od tego o Id=4? Kolumna Time nie zawiera unikalnych wartośći, przyjmuję, że drugim kryterium sortowania będzie kolumna Id. Nie chcę pominąć żadnych ani pobrać drugi raz tych samych wierszy, kiedy będę chciał pobierać kolejne X wierszy.

| Id | Time |
| 5 | 12:00 |
| 4 | 12:00 |
| 3 | 12:00 |
| 2 | 11:00 |
| 1 | 10:00 |
Id jest typu integer. Time jest typu timestamp.

Entity Framework Core 2.2.
  • 10
@seeksoul: Jedno i drugie. Chciałbym otrzymać:
- wiersze, które mają time mniejsze od tego który ma wiersz z Id=4
oraz
- wiersze, które mają time takie samo jak wiersz z Id=4, ale mają mniejsze Id od 4
@30012016: Podzapytaniem. Ale zobacz na Execution plan, może się okazać, ze on tego nie parametryzuje. Zakładając, ze ID to clustered index, pokusiłbym się o sprawdzenie, czy dwa zapytania nie będą wydajniejsze. Btw timespan nie jest typem do trzymania czasu. To jest do wersjonowania wierszy (teraz chyba rowversion się to nazywa). O ile na bazie to faktycznie timespan jest. Jeśli szukasz takich wierszy, które maja id mniejsze od x i do tego
@Sierpik21: nie znam SQL.

@kasa: Typ danych to dokładnie timestamp without time zone. Korzystam z ORM-a i nie znalazłem nigdzie potwierdzenia, że są w nim możliwe takie cuda z indeksami. W bazie nie mam wielu danych do testów; testując w panelu administracyjnym szybkości dla zapytania z dwoma podzapytaniami (nie mogę w Entity Framework przypisać do zmiennej) były bardzo podobne do dwóch osobnych zapytań.

Taki SQL mniej więcej mi
30012016 - @Sierpik21: nie znam SQL.

@kasa: Typ danych to dokładnie timestamp with...

źródło: comment_mbFBuaOdxyhxNIKRX69hW2Hy7CEY01pm.jpg

Pobierz
@30012016: Timestamp to nie jest typ związany z datą/czasem. Pewnie w EF modelu masz TimeSpan i on jest mapowany na sqlowy typ Time. Co do wydajności ciężko powiedzieć bez Execution plan i określeniem ile danych będzie produkcyjne. W EF core tez możesz indeksy zrobić, za pomocą migracji. Ogólnie jeśli nie znasz SQLa to wybierz inny data storage. ORM to rozwiazanie, które nie na przykryć nieznajomości technologii, tylko przyspieszyć budowanie aplikacji developerom,
@kasa: Wg dokumentacji PostgreSQL: time przechowuje czas, date przechowuje datę a timestamp datę oraz czas. W modelu mam DateTime i EF zmigrowało to do timestamp. Danych nie będzie dużo bo to aplikacja "do portfolio"; ale nie chciałbym jakiejś kaszany odwalić w klasie robiącej za repozytorium. Na tym etapie nie zmienię metody przechowywania danych. Najlepiej pewnie by było jakbym miał coś takiego jak Id, ale żeby była gwarancja tego, że zawsze wyższe
@30012016: Wybacz, nie wiem czemu, pomyślałem, ze mówisz o mssql. Uwaga o timestamp w takim razie nieaktualna. Indeks tylko przyspieszy wyszukiwanie, Ty sam do niego się nie odwołujesz. Bez indeksu silnik będzie robił table scana, ale w aplikacji do portfolio może to nie mieć aż tak dużego znaczenia. W ostateczności: jeździć obserwować. Jak zauważysz z czasem, ze to zapytanie trwa długo, albo zabiera za dużo zasobów, to dodasz indeks na bazie.