|
Изречение 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 %'
|