SQL fejtörő 10.
Feladat: az alábbi lekérdezés nagyon lassan fut le, nálam a költsége SQL Server 2014 alatt 1145 sec. Hozzá kellene írni a selecthez valamit, amitől a költsége leesik sokkal kisebbre.
USE TempDB GO CREATE TABLE Table1 (A CHAR(5) NOT NULL) CREATE TABLE Table2 (B VARCHAR(1000) NOT NULL) GO INSERT Table1 SELECT LEFT(AddressLine1, 5) AS A FROM AdventureWorks2014.Person.Address INSERT Table2 SELECT AddressLine1 AS B FROM AdventureWorks2014.Person.Address GO SELECT * FROM Table1 INNER JOIN Table2 ON Table2.B LIKE Table1.A + '%'
A megfejtéseket szokás szerint kommentben várom, amelyeket 4 nap múlva engedek ki.
A Test Driven Development tanfolyam következő felvonása április 20-án lesz, jövő hét szerdáig még 25% kedvezménnyel lehet jelentkezni!
Nálam 2012 Express van a hozzá tartozó Adventureworks DB-vel, az Address tábla mérete 19614 sor.
A
SELECT *
FROM Table1
INNER JOIN Table2 ON
cast(Table2.B as char(5)) = Table1.A
query a konkrét esetben gyakorlatilag “0” alatt lefut.
A tempdb-m Hungarian_CI_AS-ban volt, így az ly-ok, stb. miatt eltért a resultset mérete, de Latin1-el futtatva ugyanaz a resultset.
Comment by Pócza Krisztián — 2015.03.09. @ 23:11
Hm. 9-es SQL fejtörő már volt, ez igazából már a 10-es. :)
Comment by Pócza Krisztián — 2015.03.09. @ 23:12
Gondolom a Table2.b első 5 karaktere (persze getlength-el lekérdezve) meg kellene egyezzen Table1.A-val…
Comment by Laszlo Gombos — 2015.03.10. @ 00:30
WHERE left(Table2.B,5) = Table1.A
Trükkös a feladat, mert, ha rá is jövünk, hogy a loop join a gond, a hintek nem segítenek a LIKE miatt.
Köszi a feladványt! :)
Comment by Kovács Zsolt — 2015.03.12. @ 08:14
Én így módosítanám:
SELECT *
FROM Table1
INNER JOIN Table2 ON
Table2.B LIKE Table1.A + ‘%’ and B>=A
Comment by Laci — 2015.03.12. @ 15:18