LINQ - Optymalizacja zapytań - Dydaktyka

Transkrypt

LINQ - Optymalizacja zapytań - Dydaktyka
Laboratorium
Języki i środowiska przetwarzania danych rozproszonych
Temat : LINQ1
a optymalizacja zapytań
Historia zmian
Data
Wersja
Autor
Opis zmian
15.10.2013
1.0
Tomasz Kowalski
Utworzenie dokumentu.
8.3.2014
1.1
Tomasz Kowalski
Aktualizacja zadań.
25.10.2016
1.2
Tomasz Kowalski
Aktualizacja linku do projektu 101 samples.
2.11.2016
1.3
Tomasz Kowalski
Wskazówki do uruchomienia Linq to SQL.
1 Langauage Integrated Queries
1. Cel laboratorium
Głównym celem laboratoriów jest zapoznanie się z mechanizmami ewaluacji i optymalizacji
zapytań w języku LINQ, który jest elementem platformy .NET.
2. Materiały pomocnicze
Dokumentacja MSDN:
http://msdn.microsoft.com/pl-pl/library/system.linq.aspx
101 przykładów:
http://code.msdn.microsoft.com/LINQ-Sample-Queries-13a42a54
Ćwiczenia z rozwiązaniami:
http://download.microsoft.com/download/0/e/2/0e255cf3-b11f-44cb-b42c7d55ed7b556c/linq_hands_on_lab.docx
3. Laboratorium:
1. Otwórz w Microsoft Visual Studio projekt LINQ Sample Queries:
http://coach.kis.p.lodz.pl/LINQ-SampleQueries.zip
2. Zapoznaj się zadaniami należącymi do działu LINQ to SQL – (plik LinqToSQLSamples).
UWAGA: jeżeli na Twoim komputerze masz problemy z połączeniem z bazą (np. nie jest
zainstalowana lub nie działa baza SQL Express) zainstaluj niewielką bazę Microsoft SQL
Server 2012 LocalDB (odpowiednią wersję dla Twojego systemu x86 lub x64) z:
http://www.microsoft.com/en-us/download/details.aspx?id=29062
Jeżeli baza Microsoft SQL Server 2012 LocalDB jest już zainstalowana pomiń instalację.
W pliku LinqToSQLSamples zmień wartość atrybutu connString:
private readonly static string connString = @"Server=(LocalDB)\v11.0;Integrated
Security=true;AttachDBFileName='" + dbPath + "'"; lub x64)
Jeżeli problemy z połączeniem z bazą nadal występują można spróbować zmienić wartość
atrybutu connString na:
private readonly static string connString =
@"Server=(LocalDB)\v11.0;AttachDBFileName='" + dbPath + "'";
oraz utworzyć instancję z konsoli poleceniem:
SqlLocalDb create "MyInstance" -sIntegrated
lub x64)
Ilustracja : Schemat relacyjnej bazy danych Northwind
Na ilustracji 1 przedstawiony jest schemat relacyjnej bazy danych, do której odnoszą się
zapytania z działu LINQ to SQL.
UWAGA: W projekcie zostało zrealizowane mapowanie obiektowo/relacyjne dzięki czemu w
zapytaniach zamiast złączeń możemy używać bezpośredniej nawigacji, np. produkt ma
artybuty SupplierID oraz Supplier bezpośrednio prowadzący do właściwego obiektu!
3.1. Zapytania do providera LINQ to SQL
Napisz zapytania rozwiązujące następujące problemy i umieść je w dziale z zapytaniami LINQ to
SQL tworząc nową podgrupę o nazwie lab1. Przeanalizuj transformacje zapytań LINQ na zapytania
SQL.
1. Podaj pełne dane o dostawcy, który produkuje produkt Ikura.
2. Podaj nazwy klientów, którzy zamawiali produkt Ikura.
3. * Wymyśl zapytanie odnoszące się przynajmniej do czterech tabel wykorzystujące
grupowanie! Nie korzystaj z operatora join.
3.2. Wydajność zapytań LINQ to Objects
W celu zwiększania kolekcji produktów, do projektu LINQ Sample Queries wstaw pliki:
http://team.kis.p.lodz.pl:8080/svn/samples/trunk/jispdr/LINQSamplesPatch/
UWAGA: Zrób kopię swoich zapytań znajdujących się w LinqSamples.cs.
Rozwiąż poniższe zadania dotyczące kolekcji produktów oraz zweryfikuj wydajność zapytań.
W miarę możliwości opracuj kilka rozwiązań dla tego samego zapytania. Porównaj ich wydajność i
spróbuj wyjaśnić różnice.
1. Znaleźć nazwy produktów, które są na stanie, kosztują mniej niż 10 i należą do kategorii
Seafood.
2. Dla każdej kategorii znaleźć najtańsze i najdroższe produkty. Zwrócić nazwy kategorii i
nazwy produktów. *Napisz zapytanie o złożoności lepszej niż O(k*log(k)*n*n), gdzie
n odnosi się do liczby produktów, a k do kategorii.
3. Znaleźć cenę, dla której jest najwięcej sztuk produktów (biorąc pod uwagę też
unitInStocks). Zwrócić cenę i liczbę sztuk.
4. Dla każdego produktu podać liczbę produktów, które są od niego tańsze lub jest ich mniej
sztuk na składzie.
5. Dla każdego produktu podaj liczbę produktów, które kosztują tyle samo. *Napisz zapytanie
o złożoności O(n*log(n)).
6. Do rozwiązań zastosuj Parallel LINQ i sprawdź poprawę wydajności.
7. Sprawdź wydajność zapytania z wykładu i poprzedzających laboratoriów:
produkty, których cena jednostkowa, jest równa cenie produktu o nazwie Ikura.
Spróbuj ją poprawić.
3.3. Eksperymentalna weryfikacja semantycznej równoważności
zapytań
Zaimplementuj metodę weryfikującą (możliwie dokładnie) czy wynik działania dwóch zapytań jest
taki sam. Pod uwagę możesz wziąć następujące czynniki:
•
liczba elementów zwracana przez zapytania (użyj operatora count()),
•
sprawdzenie czy elementy występujące w jednym wyniku występują też w drugim,
•
w przypadku sekwencji sprawdzenie czy kolejność elementów jest zachowana,
•
* porównanie zwracanych typów.
•
* inne...
3.4. *Testowanie zapytań dla różnych rozmiarów kolekcji.
Zaimplementuj metody, która umożliwią wielokrotne testowanie wydajności zapytania oraz
semantycznej równoważności dwóch zapytań biorą pod uwagę różne rozmiary kolekcji: np. 2, 4, 8,
16 razy mniejsze niż kolekcji oryginalnej.
Po testach rozmiar kolekcji powinien zostać przywrócony.
Takie testy mają na celu umożliwić określenie złożoności obliczeniowej zapytania oraz
dokładniejsze potwierdzenie semantycznej równoważności dwóch zapytań