A fejlesztés a termelékenység és a hatékonyság trükkök sql - használati eset

Miután egy cikksorozatot, „alapjai SQL” Úgy döntöttünk, hogy megpróbáljuk felidézni néhány nem szabványos felhasználása-SQL, és elkezd egy cikksorozatot „Trükkök a SQL”.

Adatbázis példákat

Ha az utolsó sorozat, én a legegyszerűbb adatbázis, amely azért jött létre, és tele scriptek, de most úgy döntött, hogy a szabványos példákat a Microsoft. Ennek az az oka, hogy ez lesz bonyolultabb szerkezetű és az adatok és példák közelebb lesz a valós életben.

kiviteli terv

Komolyan és nem megy bele a részletekbe, az adatbázis motort tudnia kell, milyen sorrendben és hogyan kell csatlakoztatni az asztalra, ami indexek használata, stb Más szóval, meg kell építeni (vagy a tárolt) végrehajtási terv végrehajtása előtt a lekérdezést.

A tényleges kivitelezési terv, láthatjuk SSMS (SQL Server Management Studio), kiválasztja a menüpont „Query / tartalmazza a tényleges végrehajtási terv” vagy „Ctrl + M”. Ennek eredményeként lekérdezése után a csomag akkor megjelenik egy lap „Végrehajtási terv”, amelyben minden egyes kérelmet a csomag végrehajtása grafikus kifejezések formájában jelenik meg.

Elemzés a tervek végrehajtása egy másik érdekes téma, talán már neked erről. Addig is, ha érdekli ez a téma (ez csak meg kell tudni, ha komolyan vegyenek részt a lekérdezés optimalizálás), akkor olvassa el a vonatkozó részt a MSDN. Ugyanakkor érdemes olvasni caching kiviteli tervek.

szintaxis CASE

Csak abban az esetben, hadd emlékeztessem „CASE” szintaxist. mivel annak használata viszonylag ritka:

Szeretném felhívni a figyelmet arra a tényre, hogy a „más” elhagyható, ha ennek hiányában a megfelelő „HA” visszatér NULL.

Szintén érdemes megjegyezni, hogy a visszatérési érték kompatibilisnek kell lennie. Azaz, így írhatsz:

Felhívjuk figyelmét, hogy ugyanaz a szabály, ahogy sejteni lehet, nem csak akkor működik, állandók, hanem oszlopok táblák. Ezért legyen óvatos - a kérését is dolgozhat ugyanazon adatok (például, ha a termék kódja tárolt a vonalon, de ilyenkor csak számok) és nem működik a másik (hozzá a termékhez kódot írni).

SUM CASE

Így, az első helyen, a jobb oldali - azzal a megkötéssel, az összegzés a (visszatérő 0 vagy 1). Ez a módszer lehetővé teszi, hogy ahelyett, hogy több hasonló kérések írni egyet, és hogy ez egy jó ötlet, hogy javítsa a teljesítményt.

Egy példa a néhány szintetikus, de egyszerű - Képzeld el, hogy meg kell tudni, időről időre az összes áru, valamint a piros és a fekete árut. Így lehetséges, hogy megoldja a problémát „fej”:

És így, a „SUM CASE”:

Ha SSMS (SQL Server Management Studio), hogy tartalmazza a kimenet tényleges végrehajtása a terv. azt látjuk, hogy a költségek az utolsó lekérdezés két szor kisebb, mint a teljes költség az első három.

Egy lírai kitérő - jó megértése a Microsoft SQL Server Gyakran melegítette a lélek, ha utána „elég jó”, hogy javítsa a lekérdezési teljesítmény, elkezdi végrehajtani tucatszor gyorsabb. És egy másik érdekes tény - együtt kollégámmal (rendszergazda SQL) szó nélkül előzetesen megállapodtak abban, hogy a szabad manipuláció „SUM CASE” azt jelzi, jó ismerete SQL. Tehát amit most mondtam az egyik titka az, hogyan kell átadni az SQL szakértő :)

ORDER CASE

Most megpróbáljuk „CASE”:

Ez már jobb. Mi azonban, ha megnézi, csak most szerencsés a rend azonosítóját. Ha rendezni a gyermek elemek név szerint, akkor azonnal látni a problémát.

Ahhoz, hogy helyesen rendezni a sorokat, az egyes kategóriákon belül a tulajdonosi csoport, szükségünk van egy másik kis trükk:

Remélem volna érdekes, hogy megtanulják ezeket a technikákat, vagy frissíteni a memóriát.

Van még egy kis árnyalatot válogatás esetre. Ha Case le több lehetséges rendezési mezők (az Ön esetében ez ProductCategoryID és ParentProductCategoryID) típusának minden lehetséges területét kell lennie, hogy implicite öntött a szerver az első mezőben írja le a CASE-e.
Példa - nyikorgó alább.
@SortMode értéken értéke 1, 2 vagy akár 3 vіpolnyat script rendben van, de ha 4 - kopogtat hiba

Msg 245, Level 16, State 1, 28. sor
Conversion sikerült alakításakor a nvarchar érték „3,14159” adattípus int.

Tehát légy óvatos!
--------
HA object_id (tempdb .. # TmpTbl ", 'U') nem nulla
DROP TABLE #TmpTbl

CREATE TABLE #TmpTbl (IId INT, IIdExt INT, ncode nvarchar (10), NCodeExt nvarchar (10))

; WITH LineNumber AS (
SELECT F1.INo + F2.INo * 10 AS INo
FROM (
SELECT 0 a INo
UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
UNION SELECT UNION SELECT 4 5 6 UNION SELECT
UNION SELECT UNION SELECT 7 8 9 UNION SELECT
) AS F1
CROSS JOIN (
SELECT 0 a INo
UNION SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) AS F2

)
INSERT INTO #TmpTbl
SELECT ln.Ino, ln.Ino * SIN (ln.Ino), az STR (ln.Ino) ln.Ino * PI () FROM LineNumber ln

DECLARE @SortMode INT
SET @SortMode = 4

SELECT t. * FROM #TmpTbl AS t ORDER BY
CASE @SortMode
Mikor 1 THEN t.IId
HA 2, akkor t.IIdExt
Amikor 3 AKKOR t.NCode
Mikor 4 THEN t.NCodeExt
VÉGE
ASC

Én nem vitatkozni, sőt, hogy írtam erről a fejezetben arról az esetről :) Vagy nem eléggé koncentrált?

Jó napot, és itt van egy kérdés:
Tegyük fel, hogy a folyamat jön néhány lehetőség szűrőket.
Használata Case és ehelyett kopipasta kényelmes például a következőképpen állítjuk elő:
select * from tábla
ahol ország =
ügy @par
1, ha majd 'Ukrajna
ha 2, akkor az „Oroszország”
.
ha null majd országban

(Azaz, az utolsó sor azt jelzi, hogy minden országban esik a minta) - amennyire a helyes döntés, hogy túl sok, összehasonlítva a becsapódási sebesség?

És a második kérdés: ha az egyik esetben szükség ispolzovant „hasonló” - a nem szigorú véletlen, és szigorú, jobb lenne „=”, akkor lehetőség van a tervezés esetén alkalmazható ebben az esetben; amíg az összes kellett szűrjük át, mint a (ország, mint ország szigorú) vagy másolja az egész eljárást a változás az 1. sorban (valószínűleg azért, mert valamennyien, és semmi sem az, hogy nem, általában ez a kérdés))
köszönöm

Általában, ha törődnek a teljesítmény, akkor jobb, ha telepíteni keresztül „OR”.
A konkrét esetben láthatjuk a végrehajtási tervet a két lehetőség (feltételezve, hogy az adatmennyiség elegendő), és válassza ki a kilátást a különbség (vagy annak hiánya) megvalósítási költsége.

Kapcsolódó cikkek