Sql ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹: ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ — SQL Server | Microsoft Learn

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ поиска / Π₯Π°Π±Ρ€

По ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°ΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈΒ Craig Freedman

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ SQL Server приступит ΠΊ поиску ΠΏΠΎ индСксу, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ индСкса подходящими для ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° запроса.

Π˜Π½Π΄Π΅ΠΊΡΡ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ столбцу

Π‘ индСксами ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ столбцу всё довольно просто. SQL Server ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для самых простых сравнСний, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, равСнства ΠΈ нСравСнства (большС Ρ‡Π΅ΠΌ, мСньшС Ρ‡Π΅ΠΌ, ΠΈ Ρ‚.Π΄.). Π‘ΠΎΠ»Π΅Π΅ слоТныС выраТСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ столбцу ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ «LIKE» с символами подстановки, Π±ΡƒΠ΄ΡƒΡ‚ Π² Ρ‚Π°ΠΊΠΈΡ… случаях ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ трудности для использования поиска ΠΏΠΎ индСксу.

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ индСкс ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ столбцу, созданный ΠΏΠΎ полю «a». Π­Ρ‚ΠΎΡ‚ индСкс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для поиска ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°Ρ…:

a = 3.14
a > 100
a between 0   and 99   
a like 'abc%'
a in (2,   3, 5,   7)

Однако, поиск ΠΏΠΎ индСксу Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ задСйствован Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹:

ABS(a) = 1
a + 1 = 9
a like '%abc'

Π˜Π½Π΄Π΅ΠΊΡΡ‹ ΠΏΠΎ нСскольким столбцам

Π‘ индСксами ΠΏΠΎ нСскольким столбцам Π΄Π΅Π»ΠΎ обстоит слоТнСС. Для Ρ‚Π°ΠΊΠΈΡ… индСксов Π²Π°ΠΆΠ΅Π½ порядок ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π­Ρ‚ΠΈΠΌ опрСдСляСтся порядок сортировки индСкса, ΠΈ ΠΎΡ‚ порядка ΠΊΠ»ΡŽΡ‡Π΅ΠΉ зависит Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ² поиска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ SQL Server смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого индСкса.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ порядка ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ. Для Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎΡ…ΠΎΠ΄ΠΈΡ‚ индСкс с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ: «Ρ„амилия» ΠΈ «ΠΈΠΌΡ». Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ отсортировано ΠΏΠΎ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ поиск ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ. Однако, Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя, ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список людСй с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Π½Π°ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π½Π°ΠΌ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ подошла другая тСлСфонная ΠΊΠ½ΠΈΠ³Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π°Π±ΠΎΠ½Π΅Π½Ρ‚Ρ‹ отсортированы ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ обстоит Π΄Π΅Π»ΠΎ, Ссли ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ индСкс ΠΏΠΎ Π΄Π²ΡƒΠΌ столбцам, Ρ‚.Π΅. ΠΌΡ‹ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ столбцу, Ссли ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ равСнства для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца. Π”Π°ΠΆΠ΅ Ссли ΠΌΡ‹ Π½Π΅ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс для удовлСтворСния условия ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ столбца, ΠΌΡ‹ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца. Π’ этом случаС, вводится остаточный ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ для ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ столбца, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для просмотра.

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ индСкс ΠΏΠΎ Π΄Π²ΡƒΠΌ столбцам «a» ΠΈ «b». ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для поиска ΠΏΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ для индСксов ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ столбцу. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это индСкс ΠΈ для поиска со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ:

a = 3.14   and b = 'pi'   
a = 'xyzzy' and b <= 0

Для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс для удовлСтворСния условий ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° для столбца «a», Π½ΠΎ Π½Π΅ для столбца «b». Π’ этих случаях потрСбуСтся остаточный ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚:

a > 100 and   b > 100
a like 'abc%' and b = 2

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс для поиска со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π½ΠΈΠΆΠ΅ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ поиск Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π΄Π°ΠΆΠ΅ ΠΏΠΎ столбцу «a». Π’ Ρ‚Π°ΠΊΠΈΡ… случаях, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ индСкс (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΉ индСкс, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ столбСц «b» ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ), ΠΈΠ»ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ просмотр с остаточным ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ.

b = 0
a + 1 = 9   and b between   1 and   9
a like '%abc' and b in (1, 3,   5)

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠΊΠΈ.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму:

create table   person (id int, last_name varchar(30),   first_name varchar(30))
create unique   clustered index   person_id on person (id)
create index   person_name on person (last_name, first_name)

НиТС прСдставлСны Ρ‚Ρ€ΠΈ запроса с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠΌ тСкстовыми ΠΏΠ»Π°Π½Π°ΠΌΠΈ исполнСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запрос осущСствляСт поиск ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ столбцам индСкса person_name. Π’Ρ‚ΠΎΡ€ΠΎΠΉ запрос ΠΈΡ‰Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ столбцу ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ остаточный ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, для ΠΎΡ†Π΅Π½ΠΊΠΈ first_name. Π’Ρ€Π΅Ρ‚ΠΈΠΉ запрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ просмотр с остаточным ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ.

select id from   person where last_name = 'Doe' and   first_name = 'John'
Β  |--Index   Seek(OBJECT:([person].[person_name]), SEEK:([person].[last_name]='Doe' AND   [person].[first_name]='John'))
select id from   person where last_name > 'Doe' and   first_name = 'John'
Β  |--Index   Seek(OBJECT:([person].
[person_name]), SEEK:([person].[last_name] > 'Doe'),Β  WHERE:([person].[first_name]='John')) select id from person where last_name like '%oe' and first_name = 'John' Β  |--Index Scan(OBJECT:([person].[person_name]),Β  WHERE:([person].[first_name]='John' AND [person].[last_name] like '%oe'))

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если Π’Ρ‹ ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ воспроизвСсти эти ΠΏΠ»Π°Π½Ρ‹ для этих ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ я использовал подсказки индСксов (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΏΠ»Π°Π½Π° запроса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Ρ…ΠΎΡ‚Π΅Π» ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π±Π΅Π· нСобходимости вставки Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎ ΠΊΠ»ΡŽΡ‡Π°Ρ… индСкса

ΠžΡ‡Π΅Π½ΡŒ часто ΠΊΠ»ΡŽΡ‡ΠΈ индСкса ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π°Π±ΠΎΡ€ΠΎΠΌ столбцов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² инструкции ΠΏΠΎ созданию этого индСкса. Однако, ΠΊΠΎΠ³Π΄Π° создаСтся нСкластСризованный ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с кластСризованным индСксом, Π² ΠΊΠ»ΡŽΡ‡ нСкластСризованного индСкса добавляСтся ΠΊΠ»ΡŽΡ‡ кластСризованного индСкса, Ссли ΠΎΠ½ Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ нСкластСризованного индСкса.

Поиск ΠΏΠΎ этим нСявным ΠΊΠ»ΡŽΡ‡Π°ΠΌ осущСствляСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ явно.

НапримСр, рассмотрим Ρ‚Π°ΠΊΡƒΡŽ схСму:

create table   T_heap (a int, b int,   c int, d int,   e int, f int)
create index   T_heap_a on T_heap (a)
create index   T_heap_bc on T_heap (b, c)
create index   T_heap_d on T_heap (d) include (e)
create unique   index T_heap_f on   T_heap (f)
create table   T_clu (a int, b int,   c int, d int,   e int, f int)
create unique   clustered index   T_clu_a on T_clu (a)
create index   T_clu_b on T_clu (b)
create index   T_clu_ac on T_clu (a, c)
create index   T_clu_d on T_clu (d) include (e)
create unique   index T_clu_f on   T_clu (f)

Π‘Ρ‚ΠΎΠ»Π±Ρ†Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ столбцы для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· индСксов:

ИндСкс

Π‘Ρ‚ΠΎΠ»Π±Ρ†Ρ‹ ΠΊΠ»ΡŽΡ‡Π°

ΠŸΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ столбцы

T_heap_a

a

a

T_heap_bc

b, c

b, c

T_heap_d

d

d, e

T_heap_f

f

f

T_clu_a

a

a, b, c, d, e

T_clu_b

b, a

a, b

T_clu_ac

a, c

a, c

T_clu_d

d, a

a, d, e

T_clu_f

f

a, f

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ нСкластСризованный индСкс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ T_clu Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ столбСц кластСризованного индСкса, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ индСкса T_clu_f.

ОписанноС Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π΅ измСнилось ΠΈ Π² SQL Server 2005. Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ нСкластСризованныС индСксы Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ кластСризованного индСкса Π² свой Π½Π°Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… столбцов, Π½ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΡ… ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ столбцами. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ кластСризованному ΠΊΠ»ΡŽΡ‡Ρƒ, Π½ΠΎ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ значСния ΠΏΠΎ индСксу. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ кластСризованного индСкса хранится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° страницах листового уровня сбалансированного Π΄Π΅Ρ€Π΅Π²Π°; ΠΎΠ½ Π½Π΅ хранится Π½Π° страницах Π½Π΅ листового уровня. ΠšΠ»ΡŽΡ‡ кластСризованного индСкса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для поиска Π·Π°ΠΊΠ»Π°Π΄ΠΎΠΊ. НСт Π½ΡƒΠΆΠ΄Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ кластСризованного индСкса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ индСкса ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ строку. Π’ SQL Server 2000, фактичСски ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ кластСризованного индСкса, Π½ΠΎ это относится ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ остаточного ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, Π° Π½Π΅ Π² Π²ΠΈΠ΄Π΅ поиска.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL: AND ΠΈ OR.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL: AND ΠΈ OR. — it-black.ru ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ AND ΠΈ OR β€” ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ языка SQL, слуТащиС для создания логичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’ SQL ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ значСния TRUE ΠΈΠ»ΠΈ FALSE. ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ AND β€” эквивалСнт логичСского умноТСния (ΠΊΠΎΠ½ΡŠΡŽΠ½ΠΊΡ†ΠΈΠΈ), ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ OR β€” эквивалСнт логичСского слоТСния (Π΄ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΠΈ).

Π’Π°Π±Π»ΠΈΡ†Π° истинности для ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ²:

first_expressionlast_expressionANDOR
TRUETRUETRUETRUE
TRUEFALSEFALSETRUE
FALSETRUEFALSETRUE
FALSEFALSEFALSE
FALSE

Для выполнСния условия ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° AND Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ±Π° условия. Для выполнСния ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° OR Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ условиС.

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ AND ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:


boolean_expression AND boolean_expression

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ OR ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:


boolean_expression OR boolean_expression

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SQL AND & OR. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° Planets:

IDPlanetNameRadiusSunSeasonOpeningYearHavingRingsOpener
1Mars33966871659NoChristiaan Huygens
2Saturn6026810759.22β€”Yesβ€”
3Neptune24764601901846YesJohn Couch Adams
4Mercury2439115.881631NoNicolaus Copernicus
5Venus60512431610NoGalileo Galilei

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ AND ΠΈ OR вывСсти записи ΠΏΠ»Π°Π½Π΅Ρ‚, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… радиус ΠΏΠ»Π°Π½Π΅Ρ‚Ρ‹ мСньшС 10000 ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… (OpeningYear) послС 1620:


SELECT * FROM Planets WHERE Radius  1620;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ AND ΠΈ OR вывСсти записи ΠΏΠ»Π°Π½Π΅Ρ‚, названия ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с Π±ΡƒΠΊΠ²Ρ‹ Β«NΒ» ΠΈΠ»ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π±ΡƒΠΊΠ²Ρƒ Β«sΒ» ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ»Π΅Ρ†:


SELECT *
FROM Planets
WHERE (PlanetName LIKE 'N%'
OR PlanetName LIKE '%s')
AND HavingRings = 'No';

Π‘Π°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ создайтС Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Planets ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ коммСнтариях ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ.

Facebook

Twitter

  • One Comment

Π“Ρ€ΡƒΠΏΠΏΠ° Π² VK

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΡƒ?

Π‘ΠΎΠΎΠ±Ρ‰ΠΈΡ‚Π΅ Π½Π°ΠΌ ΠΎΠ± этом, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ тСкст с ошибкой ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl+Enter, Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹!

Π‘Π²Π΅ΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ

Облако ΠΌΠ΅Ρ‚ΠΎΠΊ
Instagram Vk Youtube Telegram Odnoklassniki

ПолСзно Π·Π½Π°Ρ‚ΡŒ

Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ

Авторы

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Π² SQL

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Π² SQL

3 мая 2022 г. by Robert Gravelle

На этой Π½Π΅Π΄Π΅Π»Π΅ ΠΌΡ‹ Π½Π΅Π½Π°Π΄ΠΎΠ»Π³ΠΎ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠŸΠ°ΡƒΠ·Π°Β» ΠΈΠ· сСрии «НСкоторыС основныС ошибки SQL-запросов», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°Ρ… Π² SQL. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² части 3 сСрии Β«ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ошибки SQL-запросов».

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ β€” это просто Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся ИБВИНА, Π›ΠžΠ–Π¬ ΠΈΠ»ΠΈ ΠΠ•Π˜Π—Π’Π•Π‘Π’ΠΠž. ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² условиях поиска ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ WHERE ΠΈ HAVING, условиях соСдинСния ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ FROM, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ части запроса, Π³Π΄Π΅ трСбуСтся логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

БущСствуСт мноТСство Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС:

  • Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅
  • КАК
  • ΠœΠ•Π–Π”Π£
  • Π’
  • Π‘Π£Π©Π•Π‘Π’Π’Π£Π•Π’
  • IS NULL (/INTEGER/DECIMAL/FLOAT…)

Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ².

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠ°ΠΊ WHERE employee_salary > 100000 , ΠΌΡ‹ создаСм ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ оцСниваСтся ΠΊΠ°ΠΊ ИБВИНА, Π›ΠžΠ–Π¬ ΠΈΠ»ΠΈ ΠΠ•Π˜Π—Π’Π•Π‘Π’ΠΠž. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • = Ρ€Π°Π²Π½ΠΎ
  • > Π‘ΠΎΠ»ΡŒΡˆΠ΅
  • < МСньшС
  • >= Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ
  • <= МСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ
  • <> НС Ρ€Π°Π²Π½ΠΎ

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ сравнСния ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΈΠ΄:

Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅_1 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅_2
 

Π’ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅ сравнСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅2 Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подзапросом. Если подзапрос Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ сравнСния оцСниваСтся ΠΊΠ°ΠΊ FALSE.

Π’ SQL ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ сопоставлСния с шаблоном Π½ΠΎΠΌΠ΅Ρ€ ΠΎΠ΄ΠΈΠ½ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ LIKE, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ сравниваСт значСния столбца с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ шаблоном. Like Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΡŽΠ±Ρ‹ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π΄Π°Ρ‚ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ BETWEEN Π·Π°Π΄Π°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ниТнюю ΠΈ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ опрСдСляСмых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. НапримСр, Π² ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅ Π΄ΠΎΡ…ΠΎΠ΄ ΠœΠ•Π–Π”Π£ 5000 И 20000 Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΉ 5000 ΠΈ мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΉ 20000. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠœΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с числовыми, тСкстовыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄Π°Ρ‚Π°ΠΌΠΈ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ IN позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для поиска запроса. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ условия являСтся TRUE, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ столбца Ρ€Π°Π²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ IN:

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ EXISTS ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ подзапрос Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, Ссли подзапрос Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько строк, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ FALSE, Ссли ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль строк.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ IS NULL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ пустым, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° сравнСния =. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊ выраТСниям Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ строк всС элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ IS NULL ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

Π―Π’Π›Π―Π•Π’Π‘Π― [НЕ]ΠΠ£Π›Π¬ΠΠ«Πœ
 

НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ x IS NULL Ρ€Π°Π²Π½ΠΎ TRUE, Ссли x Ρ€Π°Π²Π½ΠΎ NULL.

IS UNKNOWN являСтся синонимом IS NULL, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ BOOLEAN.

Π’ΠΎΡ‚ запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ IS NOT NULL для получСния всСх участников, Ρ‡ΡŒΡ фамилия Π½Π΅ Ρ€Π°Π²Π½Π° NULL:

Π’ этом Π±Π»ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΡ€Π΅Ρ€Π²Π°Π»ΠΈ рСгулярно Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠ³, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ этот Π²Π°ΠΆΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠΊ ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°Ρ… SQL. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² условиях поиска ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ WHERE ΠΈ HAVING, условиях соСдинСния ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ FROM, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ β€” это выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ TRUE, FALSE ΠΈΠ»ΠΈ UNKNOWN. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π΅Π΄Π΅Π»ΠΈ ΠΌΡ‹ снова ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Π² ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ сСрии Β«ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ошибки SQL-запросов».

Π€ΠΈΠ»ΡŒΡ‚Ρ€-ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой основной риск для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Oracle SQL

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Oracle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для примСнСния , Π³Π΄Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ²):

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ доступа («доступ»)

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ доступа Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ условия остановки ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ индСксного Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° (Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Β» для индСксных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ)

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ индСксного Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. Они Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° условия запуска ΠΈ остановки ΠΈ Π½Π΅ ΡΡƒΠΆΠ°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ сканирования.

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Β» для Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ)

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ для столбцов, Π½Π΅ входящих Π² индСкс, ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Для этого Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Π° сначала Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ строку ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ индСксного Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π»ΠΎΠΆΠ½ΠΎΠ΅ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ бСзопасности; Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ использовании индСкса ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ быстро сниТаСтся ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ объСма Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° систСму.

ΠŸΠ»Π°Π½Ρ‹ выполнСния, созданныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° DBMS_XPLAN (см. Β« ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½Π° выполнСния Β»), ΠΏΠΎΠΊΠ°ΠΆΠΈΡ‚Π΅ использованиС индСкса Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°Ρ…Β» ΠΏΠΎΠ΄ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ выполнСния:

 --------------- ---------------------------------------
| Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ | ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ | Имя | Ряды | Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ |
-------------------------------------------------- ----
| 0 | Π’Π«Π‘Π•Π Π˜Π’Π• Π—ΠΠ―Π’Π›Π•ΠΠ˜Π• | | 1 | 1445 |
| 1 | Π‘ΠžΠ Π’Π˜Π ΠžΠ’ΠΠ’Π¬ АГРЕГАВ | | 1 | |
|  * 2  | Π˜ΠΠ”Π•ΠšΠ‘ Π”Π˜ΠΠŸΠΠ—ΠžΠ БКАН | SCALE_SLOW | 4485 | 1445 |
-------------------------------------------------- ----
  Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅ (опрСдСляСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ): 
     2  - доступ ("РАЗДЕЛ" =: A И  "ID2" =: B )
         Ρ„ΠΈΠ»ΡŒΡ‚Ρ€("ID2"=:B) 
 

НумСрация ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° относится ΠΊ столбцу Β«IdΒ» ΠΏΠ»Π°Π½Π° выполнСния. Π’Π°ΠΌ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

ΠžΡ‚ своСго ΠΈΠΌΠ΅Π½ΠΈ

Π― Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽ Π½Π° Тизнь ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ SQL, настройкой ΠΈ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ SQL, Π° Ρ‚Π°ΠΊΠΆΠ΅ своСй ΠΊΠ½ΠΈΠ³ΠΎΠΉ «ОбъяснСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ SQLΒ». Π£Π·Π½Π°ΠΉΡ‚Π΅ большС Π½Π° https://winand.at/.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, взятый ΠΈΠ· Π³Π»Π°Π²Ρ‹ Β«ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒΒ», ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ INDEX RANGE SCAN с ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ доступа ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Oracle Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ² доступа Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ID2=:B Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΠ»Π°Π½Π΅ выполнСния.

Π’Π°ΠΆΠ½ΠΎ

Если условиС отобраТаСтся ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, это ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° β€” Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, отобраТаСтся Π»ΠΈ ΠΎΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ доступа.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ INDEX RANGE SCAN сканируСт вСсь Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ условия "РАЗДЕЛ"=:A ΠΈ примСняСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ "ID2"=:B ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС.

ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *