2011-12-22 3 views
0

나는 내 sql server 2005 데이터베이스에 약 5 천만 개의 레코드가 들어있는 테이블을 가지고 있습니다. 나는 firstNameLastName 열을 가지고 있으며, 사용자가 영원히받지 않고도이 열을 검색 할 수 있도록하고 싶습니다. 이러한 열을 인덱싱 할 수 없기 때문에 쿼리를 빠르게 처리 할 수 ​​있습니까? 또한 비슷한 소리가 나는 이름을 검색하고 싶습니다. 예를 들어 사용자가 Danny를 검색하는 경우 Dan, Daniel이라는 이름의 레코드를 반환하고 싶습니다. 사용자가 실제로 검색 한 결과에 얼마나 가까운지를 사용자에게 표시하는 것이 좋을 것입니다. 이것이 응석 과제라는 것을 알고 있지만, 나는이 문제에 직면 한 세계 최초의 사람이 아닐 것이라고 생각한다. :)Sql 수백만 건의 레코드를 검색합니다. 가능한?

당신의 도움에 감사드립니다.

+0

"순위에서 % 결과를 얼마나 가까운가":이 퍼센트 계산을 위해 알고리즘을 알아야합니다. –

+1

[DIFFERENCE] (http://msdn.microsoft.com/en-us/library/aa258844(v=SQL.80) .aspx)를 사용하여 "rank in % close"를 계산할 수 있습니다. –

+0

"인덱싱이 부족합니다 이 열 "- 왜이 열을 색인화하지 않으시겠습니까? –

답변

0

전체 텍스트 색인 생성을 시도해 보셨습니까? 1 백만 개가 넘는 테이블의 무료 텍스트 필드에이 파일을 사용하여 매우 빠른 것으로 나타났습니다. Dan, Danial 및 Danny가 모두 같은 색인을 생성 할 수 있도록 동의어를 추가 할 수 있습니다 (이름이 같은 이름의 사전을 구하는 것은 다른 이야기입니다). 와일드 카드 검색도 허용합니다. 전체 텍스트 인덱싱도 순위를 매길 수 있지만 이름이 덜 유용하다는 것을 알았지 만 (문서가 더 좋음)

+0

전체 텍스트 인덱싱은 텍스트가 완전히 동일한 경우에만 답변을 제공합니다. 그것은 정말로 빠르지 만 저자가 원하는 것이 아닙니다. – Wis

3

우리는 50 억 개의 레코드 (오라클이지만 비슷한 퍼포먼스가 있어야 함)가있는 데이터베이스를 보유하고 있습니다. 적절한 색인이 있으면 몇 밀리 초 내에 검색 할 수 있습니다. 귀하의 경우 firstname 및 lastname에 색인을 붙이십시오. 바이너리 트리 인덱스를 사용하면 데이터베이스의 크기에 따라 성능이 향상됩니다. 주의 깊은 LIKE 절은 종종 색인의 사용을 중단하고 대부분 성능을 저하시킵니다. 와일드 카드가 문자열의 오른쪽에만있을 때 MySQL은 LIKE 절과 함께 인덱스를 계속 사용할 수 있다는 것을 알고 있습니다. SQL Server와 비슷한 검색을 수행해야합니다.

문자열 유사성은 실제로 간단하지 않습니다. http://en.wikipedia.org/wiki/Category:String_similarity_measures을 보시면 몇 가지 가능한 알고리즘을보실 수 있습니다. SQL Server가이 데이터베이스 중 하나를 구현하는지는 알 수 없습니다.이 데이터베이스는 알지 못합니다. Google의 "SQL Server"+ 알고리즘 이름을 사용하여 필요한 것을 찾을 수 있습니다. 그렇지 않으면 Wiki에서 다양한 언어로 제공되는 코드가 있습니다 (SQL이 아닐 수도 있지만 저장 프로 시저에 적용 할 수 있어야합니다).

0

이 테이블과 해당 열에 대해 전체 텍스트 인덱스를 만들 수있는 FULL TEXT SEARCH를 사용합니다.

관련 문제