2013. október 7., hétfő

OPENQUERY vs. 4 Part Linked Server Syntax

Ha SQL Server alá belinkelünk bármilyen egyéb szervert ODBC driverrel, akkor általában 2 módszerünk van lekérdezni (3 is lehet, de az most nem érdekes).

1. 4 Part Linked Server Syntax

Ez az, amikor simán megírunk egy queryt, mintha "nálunk" lenne a tábla, így:

2. OpenQuery

Az OpenQuery név talán ismerős lehet, ez az, amikor egy string-ben 'átadjuk' a query-t, aminek az eredményét szeretnénk látni. Így néz ki:

Miben különböznek?

Előszeretettel használják a legtöbben az egyszerűség és a paraméterezhetőség miatt az elsőt, hisz olyan mintha egy sima sql query-t írnánk. Akár tárolt eljárásban is használhatjuk, paraméterezhető, egyszerű a where feltétel megadása, sőt, ha így kreálunk egy view-t, abból meg még egyszerűbb lekérdezni.

Feketeleves

Amikor a "túloldalon" megszaporodnak a sorok, egyre lassabb lesz. Egészen egyszerű az oka, ugyanis az történik, hogy a túloldalról ÁTHOZ minden rekordot az adott táblából, és helyben végzi el a szűrést, ami többmilliós rekordszámnál annyira nem hatékony. Emiatt a VIEW-t sem tudjuk használni ami annyira kényelmesnek tűnik, hiszen amikor belekérdezünk a VIEW-ba, akkor is mindent áthoz, majd abból fog selectálni helyben.

A második eset NAGYON macerás, ha tárolt eljárást akarunk írni és paraméterekkel használni, de nem helyben fut le a lekérdezés. Hanem? A túloldalon, és már csak az eredményhalmaz kerül át az sql szerverhez. Szóval sokkal gyorsabb, de sajnos az OPENQUERY-nek nem lehet csak úgy paramétereket átadni.
Magyarul össze kell matyizni az sql stringet úgy, hogy paraméterektől függően legyen benne a where feltétel megírva. 1 paraméternél még annyira nem gáz, de amikor már van 4-5, és vannak dátumok is, és mindegyik lehet null is, akkor nem 2 perces feladat.

Szóval, 2 ma esti mérési eredmény, SQL Express alá linkelt SQLite adatbázissal, aminek adott táblájában 4.7 millió rekord van:
1. módszer: 
futási idő 405 sec

2. módszer: 
futási idő 1 sec

Nem mindegy...

Nincsenek megjegyzések:

Megjegyzés küldése