Sql_celko - глава 14
Глава 14. предиката [НЕ] В
Назначаване в предикат доста очевидно. Тя проверява дали стойността на даден списък от стойности. SQL-89 стандарт позволява проста проверка само скаларни количества, но в SQL-92 също се оставя експресия. предикат синтаксис:
14.1. Оптимизиране ПО предикат
Повечето процесори на базата данни не водят статистика за това колко често има някои константи в списъка с ценности и защото skanmruyut списък в реда, в който се появи. Като общо правило, разпоредено от абсолютната стойност на елементите, или по азбучен ред списък, но най-добре е да направите това от най-често срещаните стойности за по-рядко. Няма никакъв смисъл да се сложи в списъка на дубликати като предикат връща TRUE, като само открива първото копие, и никога не се отива на втория. Освен това, дори и ако това се случи, то ще бъде показано FALSE отговор, така че допълнителната изразходвани да се движат с дълъг списък от компютърно време загубил напразно.
Най-SQL процесор за извършване на предикат IN подзаявка първо място резултата в временна работна маса, а след това се сканира от ляво на дясно. Понякога това води до голяма загуба на ресурси. Например, за да видите какво е името на човека, който се продава в град билети за спортни събития, е възможно да се напише заявка:
Очаква се, че комбинацията от (град, държава) е уникален. Но нека да се разшири примера и да приемем, че персоналът живее в н градове и спортни отбори се намират в градовете, така че, когато толкова много голям п. Ако желаният град ще бъде в горната част на списъка, генериран от подзаявка на последните да приключи работата си много по-бързо, отколкото ако са се намирали в края на списъка. Представяне на резултатите от израз подзаявка съдържащ искането му не може да се контролира.
Въпреки това, можете да сортирате появата на изразите в списъка, поставяйки ги в реда на най-вероятно да се появи там.
SQL-92 стандарт ви позволява да сравните низови изрази, и ако в тяхното изпълнение на SQL сте създали отделни графи за града и за държавата, че е възможно да се напише израз:
След това отидете на таблицата с данни и изберете състезателката на мнение, една колона, като се използва SELECT изявлението.
Ако QualityGuide.stars индексирани колона, на SQL процесора е вероятно да се изгради временна таблица от четири-звездни ресторанти, както и да го дам на външен поискване. Последно ще го третира като че ли е списък на константи.
Въпреки това, като правило, тези колони не са индексирани. В този случай, процесорът извършва последователно търсене QualityGuide маса. Това искане може да бъде заменена от друга - иска да се присъедини.
Такова искане ще работи по-бързо, тъй като restname е ключов за двете маси и затова ще се използва за да се гарантира уникалност. Въпреки това, той може да се върне на дублиращи се редове, които могат да обработват SELECT DISTINCT изявлението. Да предположим, че искате да намерите ресторант, където можете да ядете по-малко от $ 10, а на ваше разположение има позоваване меню с всички видове ястия. Заявката е почти същото, както преди:
Изглежда, че тя може да се заменя със следния текст:
Въпреки това, в резултат на последните ще се появи повече линии, всяка от които отговаря на един от елементите, поставя Две долар Hash House Мърфи. За да се промени това, е необходимо да се замени SELECT restname, телефона в SELECT DISTINCT restname, телефона, но нещо за премахване на дубликати ще отнеме известно време. Ако искате да намерите най-добрият вариант, експериментът с определен продукт.
Предикатна НЕ ПО, вероятно най-добре да се замени сказуемото НЕ СЪЩЕСТВУВА. Да се върнем към нашия пример с ресторанти. Да кажем, че сме открили, че нашият приятел Джон има списък на училищата, а ние искаме да разберете за тези, които не са включени в указателя. Искане за очевидна форма:
Ако го пиша с сказуемото НЕ СЪЩЕСТВУВА, тя ще работи по-бързо:
Причината за скоростта на нарастване е да се използват индексите двете таблици. НЕ ПО версия трябва да се провери на неравенството на всички стойности от таблицата подзаявка. Изпълнение на SQL често е построена временна таблица от резултатите от подзаявка предиката III, освен ако не се съдържа клауза за КЪДЕ, но временната таблица още няма индекси. Освен това тя може да съдържа дубликати и линии в него може да бъде нарушен, така че процесора ще трябва да се извърши пълно сканиране.
14.2. Смяна на оператора или В предикат
Начинаещите програмисти често пренебрегват възможността за замяна на предиката IN предикат група, обединени от оператора OR. Например:
Тази заявка може да бъде пренаписана, като:
Причината за липсата на използване на такова искане е, че програмистите са свикнали да или подзаявки или да прости списъци на константи. Въпреки това, те да пренебрегне факта, че списъкът ПО предикат може да е списък с изрази. оптимизатор клаузата WHERE обработва всички оригинални предикати отделно, но предикат В се обработва като един от елементите, които могат да променят реда на оценка. За някои искания, този процес може да отнеме по-малко време, отколкото машинни списък предикат свързан OR.
14.3. NULL стойности и предикат В
Появата на NULL-стойности в сказуемото НЕ ПО може да доведе до някои проблеми. Да разгледаме следните две таблици:
Помислете за етапите на неговото прилагане.
1. Извършване на подзаявка:
2. Трансформация сказуемото НЕ ПО положителен:
3. Разширяване на предикат:
4. Нанесете резултат от закона на Де Морган:
5. Ние използваме постоянно логическият израз:
6. Ние намаляване на последния ред на константа
7. Резултатът винаги ще бъде празен.
Проверка за други таблици:
Нека да анализираме отново етапите на изпълнение на една и съща заявка.
1. Извършване на подзаявка:
2. Трансформация сказуемото НЕ ПО в логически израз:
3. Разширяване на предикат:
4. Нанесете закона на Де Морган:
5. изчисляване на резултата. Аз ще го покаже като съюз със замествания:
6. Резултатът е един ред = (4).
14.4. Предикат и референтен граница
Много често предикат [N, използвани в изречение CHECK () на маса. Обикновено в такъв случай е даден списък на валидни стойности колони, например:
Този метод работи добре за малки списъци на ценности, но когато се прилага за по-дълги списъци на проблеми. За да се ускори търсенето, стойността трябва да бъде включена в списъка, в реда, в който можете бързо да намерите всичко съвпадение двубуквен код state_code.
Пълната версия на SQL-92 стандарта, е възможно да се отнася към други таблици, така че един и същ ограничение може да бъде пренаписана, както следва: