Каков наиболее эффективный способ проверить, содержит ли строка еще одну в MSSQL? - PullRequest
2 голосов
/ 26 марта 2012

Мне нужно проверить, содержит ли строка (имена файлов с полным путем) еще одну строку в MSSQL.

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 26 марта 2012

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

SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%'
1 голос
/ 26 марта 2012

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

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

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

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

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

1 голос
/ 26 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...