我有三张桌子
[USER] --Master user table
[KEYWORD] --Master keyword table
[USER_KEYWORD] --[USER]-[KEYWORD] mapping table
下面是我数据库中的结构
GO
--master user table
CREATE TABLE [USER]
(
[USERID] INT IDENTITY,
[NAME] VARCHAR(50)
)
GO
--master keyword table
CREATE TABLE [KEYWORD]
(
[KEYWORDID] INT IDENTITY,
[KEYWORD] VARCHAR(50)
)
GO
--x table user_keyword
CREATE TABLE [USER_KEYWORD]
(
[USERID] INT ,
[KEYWORDID] INT
)
GO
--Insert data in master user table
INSERT INTO [USER]
SELECT 'TESTUSER1'
UNION ALL
SELECT 'TESTUSER2'
UNION ALL
SELECT 'TESTUSER3'
UNION ALL
SELECT 'TESTUSER4'
GO
--Insert data in master keyword table
INSERT INTO [KEYWORD]
SELECT 'ASP'
UNION ALL
SELECT 'ASP.NET 3.5'
UNION ALL
SELECT 'C#'
UNION ALL
SELECT 'JAVA'
UNION ALL
SELECT 'ASP.NET'
UNION ALL
SELECT 'SQL'
UNION ALL
SELECT 'SQL SERVER'
UNION ALL
SELECT 'SQL SERVER 2005'
UNION ALL
SELECT 'SQL SERVER 2008'
GO
--Insert data in user keyword table
INSERT INTO [USER_KEYWORD]
SELECT 1,1
UNION ALL
SELECT 2,2
UNION ALL
SELECT 3,3
UNION ALL
SELECT 4,4
UNION ALL
SELECT 1,2
UNION ALL
SELECT 2,3
UNION ALL
SELECT 3,4
UNION ALL
SELECT 4,1
UNION ALL
SELECT 2,3
UNION ALL
SELECT 3,4
UNION ALL
SELECT 4,6
UNION ALL
SELECT 3,6
UNION ALL
SELECT 4,6
UNION ALL
SELECT 2,7
UNION ALL
SELECT 3,8
UNION ALL
SELECT 4,9
GO
CREATE PROC TEST_SEARCH_KEYWORDS
@SEARCHKEYWORD VARCHAR(50)
AS
BEGIN
SELECT K.[KEYWORD],COUNT(UK.[KEYWORDID]) AS [KEWWORDCOUNT] FROM [KEYWORD] K
INNER JOIN [USER_KEYWORD] UK
ON K.[KEYWORDID]=UK.[KEYWORDID]
WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%')
GROUP BY K.[KEYWORD]
END
--TEST EXAMPLES
EXEC TEST_SEARCH_KEYWORDS 'ASP'
--0UTPUT
KEYWORD KEWWORDCOUNT
-------------------------------------------------- ------------
ASP 2
ASP.NET 3.5 2
--TEST EXAMPLES
EXEC TEST_SEARCH_KEYWORDS 'SQL'
--0UTPUT
KEYWORD KEWWORDCOUNT
-------------------------------------------------- ------------
SQL 3
SQL SERVER 1
SQL SERVER 2005 1
SQL SERVER 2008 1
我有一个名为TEST_SEARCH_KEYWORDS的sp,它根据从outside.Currently提供的关键字搜索记录,我在sp中使用的是相似的条件。我想知道,这会很好的从数据库中搜索记录,像将来一样使用,我的记录会不断增加.I,不想使用全文搜索,因为我也必须处理server 2000。
发布于 2009-08-19 12:29:24
一种(存储饥渴)解决方案是预先计算并在实际关键字本身旁边存储一个number关键字prefice。然后,根据外观标准,您将对相关的前缀列(如果存在的话)进行直接的相等比较,或者返回到执行“类似”比较。
例如,假设限制搜索单词必须至少包含3个字符。您可以创建列Prefix3Chars、Prefix4Chars、Prefix5Chars。假设用户输入搜索词"Hello“,而您的数据库中包含一个关键字"Hello,World”。您将选择在Prefix5Chars列上搜索,并将匹配关键字"Hello,World“。如果用户使用关键字"Hello,W“执行搜索,您将返回到使用"like”进行搜索。
发布于 2009-08-19 12:37:29
如果你继续搜索,就像:
WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%')
然后,您的查询将使用一个索引,并且随着表的增长,它的性能仍然会很好。但是,如果将其更改为:
WHERE K.[KEYWORD] LIKE ('%'+ @SEARCHKEYWORD+ '%')
然后,它将不会,它将扫描表,这将导致不良的性能,因为您的表增长。
https://stackoverflow.com/questions/1299591
复制相似问题