Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 12044|Отговор: 0

[Комуникация] Проблем с използването на индекса, когато sqlserver обработва като '%keyword%'

[Копирай линк]
Публикувано в 26.11.2014 г. 15:52:19 ч. | | | |

Изречение 1: Префиксът за процент знак % уайлдкард ще накара SQL заявки да спрат индекса и вместо това да използват пълно сканиране на таблиците. Това твърдение е популярно

Заключението е грешно

Всъщност това твърдение не е много точно. Префиксът за уайлдкард % ще направи SQL търсенето за индекси изключително ефективно, но в повечето случаи то все пак ще отиде в индекса (не е необходим пълен текст индекс, просто се изгражда нормален индекс).

СЪЗДАЙТЕ НЕКЛЪСТЕРИРАН ИНДЕКС [Ix_index ИМЕ] НА [dbo]. [wkf_ Име на маса]
(
[db_title]  ASC
)

Екзекутирайте в този момент

ИЗБЕРЕТЕ топ 10 [db_id],[db_Summary],[db_AddDate],[db_title] ОТ [име на библиотека]. [DBO]. [wkf_database] където [db_title] като '%dba%' по поръчка от 1 desc

Планът за заявка е ясно показан

Преди да се индексира сравнението:


Като изключение, сложни заявки Оптимизаторът на заявки може да изостави индекса в полза на пълно сканиране на таблицата. Това не важи само за LIKE '%keyword%', но е свързано и със сложността на заявките




Изречение 2: Процент % уайлдкард префикси ще направят SQL заявките индексни, а не без индекс

Това твърдение е много едностранно и 99% от индекса ще намали IO и ще подобри ефективността в сравнение с липсата на индексиране, но действието за съпоставяне на ключове след намиране на индекса също е отчасти изискващо производителност. Както е показано на двете фигури по-горе, ако ключовите думи са лесно съчетани, цялото сканиране на таблицата бързо намира данните, а индексното сканиране не спестява достатъчно време, за да компенсира времето, заето от действието за съпоставяне на ключове (повечето онлайн заявки нямат този проблем).
Лечение:
1. Ако не ти пука, допълнителната консумация на производителност не е много голяма. Различните ключови думи имат различна консумация, но някои ключови думи имат този проблем и могат да бъдат игнорирани
2. По-добър начин е да се изгради индекс за презаписване (известен още като INCLUDE индекс), ако условията го позволяват. Предпоставка: a. Пространството за съхранение е достатъчно, b не влияе значително на DML операциите, а c няма големи полета в презаписания индекс

СЪЗДАЙТЕ НЕКЛЪСТЕРИРАН ИНДЕКС [Ix_index ИМЕ] НА [dbo]. [wkf_ Име на маса]
(
[db_title]  ASC
)
ВКЛЮЧИ ( [db_id],[db_Summary],[db_AddDate])

В момента планът за изпълнение на заявката е следният, което е много по-освежаващо


Горното е това, което мога да си представя сега за обработка в SQLSERVER SELECT * ОТ ИМЕ НА ТАБЛИЦА КАТО '%Keyword %'






Предишен:Репликацията на транзакции чрез SQL Server добавя нови таблици без повторна инициализация
Следващ:Практическо SQL изявление: оценка на дата
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com