2012-03-26 5 views
2

Мне нужно проверить, содержит ли строка (имена файлов с полным путем) другую в MSSQL.Каков наиболее эффективный способ проверить, содержит ли строка другой MSSQL?

Мой скрипт должен проверить, находится ли файл, который мы собираемся совершить, в базе данных под определенным столбцом (сценарий предварительного подбора).

Я не могу изменить определение данных в столбце, но в настоящее время мы используем текст TEXT, и файлы разделяются символом новой строки. Я попытался использовать функцию TSQL CONTAINS, но общая производительность на самом деле не очень хорошая.

Будет ли лучше загружать все данные в массив PHP и локально локализовать компьютер?

Я не совсем уверен, что лучший способ сделать здесь.

Обновление: В базе данных содержится около 194 530 строк.

+0

Какая версия MSSQL?2008, 2005, 2000, 7 – RThomas

+0

Приложение работает под MSSQL 2000 (я знаю, это старый). Я знаю, что у нас также есть поле 2005 года, возможно, мы можем переместить базу данных на этот сервер, но я не уверен в этом. Прямо сейчас, я думаю, мне придется иметь дело с MSSQL 2000 :( –

+0

Некоторые из этого немного неясны: вы храните несколько имен файлов в одной строке столбца строки, правильно? – lyrisey

ответ

1

Главное, чтобы иметь в виду при выполнении поиска с помощью строки является то, что вы хотите чтобы ограничить длину строки, которую вы просматриваете. Прямо сейчас у вас есть несколько значений path + filename, заправленных в одну пару столбцов строки. Как я уже упоминал выше, это плохо нормировано (и является частью причины, по которой у вас возникают проблемы с поиском).

Учитывая, что вы не можете изменить схему таблицы, с которой вы столкнулись, лучшей альтернативой может быть создание структуры для работы с метаданными, которые описывают файлы, хранящиеся в определенной строке.

Например, один из вариантов может быть, чтобы создать таблицу, содержащую filename - rowID пар, где каждая строка исходной таблицы связывается с проанализированных-аут имен файлов в TEXT столбце этой строки. Это дает вам возможность ограничить поиск, сначала сделав поиск по более короткой строке (filename), а затем используя это ограничение, чтобы помочь выполнить поиск меньшего количества строк, чтобы удовлетворить комбинацию пути + имя файла и добиться уникального результата.

Если у вас есть большое количество файлов с одинаковыми именами, другой вариант может заключаться в реализации хэш-индекса, используя rowID s из вашей исходной таблицы и хэш каждого пути + имя файла из этой строки, используя CHECKSUM() или любую функцию хеширования у вас есть.

Использование таблицы индексирования, подобной этой, добавляет накладные расходы: вам необходимо поддерживать метаданные по мере обновления исходной таблицы, но это также означает, что вы делаете свой тяжелый взнос досрочно и делаете будущие запросы данных намного быстрее.

1

Как насчет использования оператора LIKE? Вы могли бы сделать что-то вроде этого

SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%' 

Если это не соответствует вашим потребностям, то я согласен, что бы делать это программно может быть лучше. Проблема в том, что SQL использует основанную на множестве логику, поэтому, когда вы начинаете делать что-то более процедурное (функции), оно ломается. Очевидно, что запускайте тесты, но программно вы должны быть в состоянии сделать это быстрее. Вы можете использовать регулярные выражения или содержит или все, что может быть лучше в PHP

+0

Это первое, что я пробовал, лично я обнаружил, что выступления были лучше с CONTAINS (может быть, это только я ...). Кроме того, я не думаю, что у нас есть указатель на этот столбец ... –

+0

@ Pierre-OlivierBourgeois Тогда я бы согласился, что делать это программно может быть лучше. Проблема в том, что SQL использует основанную на множестве логику, поэтому, когда вы начинаете делать что-то более процедурное (функции), оно ломается. Очевидно, что запускайте тесты, но программно вы должны быть в состоянии сделать это быстрее. Вы можете использовать регулярные выражения или содержать или что-то еще лучше всего в php. –

+0

Вот и я тоже. Но теперь вопрос в том, что было бы правильным способом сохранить все эти строки в PHP? Хранение этого в массиве закончилось бы заполнением ОЗУ, я не прав? –

1

Я думаю, что это будет быстрее:

SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%' 
+0

+1 для редактирования, но я не думаю, что это будет быстрее на практике. – JNK