Результаты поиска
Почему SQL полнотекстовая индексация не возвращает результаты для слов, содержащих #?
Например, мой запрос выглядит следующим образом, используя SQL Server 2005:
SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#')
У меня есть полнотекстовый индекс, определенный для использования столбца SearchField, который возвращает результаты при использовании:
SELECT * FROM Table WHERE SearchField LIKE '%c#%'
Я считаю, что # - это специальная буква, поэтому как я могу разрешить FREETEXT правильно работать для запроса выше?
Как работает индексация баз данных?
Учитывая, что индексация так важна, поскольку ваш набор данных увеличивается в размере, может ли кто-нибудь объяснить, как индексирование работает на уровне базы данных-агностика?
Сведения о запросах для индексации поля см. В разделе Как индексировать столбец базы данных .
Как индексировать столбец базы данных
Надеюсь, я смогу получить ответы для каждого сервера баз данных.
Для получения общих сведений о том, как работает индексация, ознакомьтесь с разделом: как работает индексация базы данных?
Таблицы без первичного ключа
У меня есть несколько таблиц, единственными уникальными данными которых является столбец uniqueidentifier (Guid). Поскольку GUID не являются последовательными (и они генерируются на стороне клиента, поэтому я не могу использовать newsequentialid()), я сделал непервичный, некластеризованный индекс для этого поля ID, а не дал таблицам кластеризованный первичный ключ.
Мне интересно, каковы последствия этого подхода для производительности. Я видел, как некоторые люди предполагают, что таблицы должны иметь автоинкрементный ("identity") int в качестве кластеризованного первичного ключа, даже если он не имеет никакого значения, поскольку это означает, что сам компонент database engine может использовать это значение для быстрого поиска строки вместо того, чтобы использовать закладку.
Моя база данных реплицируется слиянием через кучу серверов, поэтому я избегаю столбцов identity int, поскольку они немного волосаты, чтобы получить право на репликацию.
О чем вы думаете? Таблицы должны иметь первичные ключи? Или это нормально-не иметь никаких кластеризованных индексов, если нет никаких разумных столбцов для индексирования таким образом?
Индекс Базы Данных Без Учета Регистра?
У меня есть запрос, в котором я ищу по строке:
SELECT county FROM city WHERE UPPER(name) = 'SAN FRANCISCO';
Теперь это работает нормально, но масштабируется не очень хорошо, и мне нужно его оптимизировать. Я нашел вариант создания сгенерированного представления или что-то в этом роде, но я надеялся на более простое решение с использованием индекса.
Мы используем DB2 , и я действительно хочу использовать выражение в индексе, но эта опция, кажется, доступна только на z/OS,, однако мы запускаем Linux. Я все равно попробовал индекс выражения:
CREATE INDEX city_upper_name_idx
ON city UPPER(name) ALLOW REVERSE SCANS;
Но, конечно, он давится на UPPER(имя).
Есть ли другой способ создать индекс или что-то подобное таким образом, чтобы мне не нужно было перестраивать существующие запросы для использования нового сгенерированного представления, изменять существующие столбцы или любые другие подобные навязчивые изменения?
EDIT: я готов выслушать решения для других баз данных... он может перейти на DB2...
В чем разница между сканированием таблиц и сканированием кластеризованных индексов?
Поскольку и A Table Scan , и a Clustered Index Scan по существу сканируют все записи в таблице, почему Кластеризованное сканирование индекса предположительно лучше?
В качестве примера-какова разница в производительности между следующими, когда есть много записей?:
declare @temp table(
SomeColumn varchar(50)
)
insert into @temp
select 'SomeVal'
select * from @temp
-----------------------------
declare @temp table(
RowID int not null identity(1,1) primary key,
SomeColumn varchar(50)
)
insert into @temp
select 'SomeVal'
select * from @temp
PostgreSQL: индексы GIN или GiST?
Из той информации, которую я смог найти, они оба решают одни и те же проблемы - более эзотерические операции, такие как удержание массива и пересечение (&&,@>, <@, и т. д.). Однако мне было бы интересно получить совет о том, когда использовать тот или иной метод (или ни один из них).
Документация PostgreSQL содержит некоторую информацию об этом:
- GIN поиск по индексу примерно в три раза быстрее, чем GiST
- GIN индексация занимает примерно в три раза больше времени, чем GiST
- GIN индексы обновляются примерно в десять раз медленнее, чем GiST
- GIN индексы в two-to-three раз больше, чем GiST
Однако мне было бы особенно интересно узнать, есть ли влияние на производительность, когда объем памяти для индексирования начинает уменьшаться (т. е. размер индекса становится намного больше, чем доступная память)? Мне сказали на канале #postgresql IRC, что GIN должен хранить весь индекс в памяти, иначе он не будет эффективен, потому что, в отличие от B-дерева, он не знает, какую часть читать с диска для конкретного запроса? Вопрос был бы таков: верно ли это (потому что мне тоже говорили обратное)? Имеет ли GiST такие же ограничения? Существуют ли другие ограничения, о которых я должен знать при использовании одного из этих алгоритмов индексирования?
Почему сервер SQL работает быстрее, когда вы индексируете таблицу после ее заполнения?
У меня есть sproc, который помещает 750k записей во временную таблицу через запрос в качестве одного из своих первых действий. Если я создаю индексы для временной таблицы до ее заполнения, то выполнение элемента занимает примерно вдвое больше времени, чем при индексации После заполнения таблицы. (Индекс-это целое число в одном столбце, индексируемая таблица - это всего лишь два столбца, каждый из которых является одним целым числом.)
Это кажется мне немного странным, но тогда у меня нет самого твердого понимания того, что происходит под капотом. У кого-нибудь есть ответ на этот вопрос?