当前位置: 代码迷 >> Sql Server >> 跪求Sql Server2008海量数据的高速处理办法,1秒内实现模糊查询并排序解决方法
  详细解决方案

跪求Sql Server2008海量数据的高速处理办法,1秒内实现模糊查询并排序解决方法

热度:82   发布时间:2016-04-27 17:18:02.0
跪求Sql Server2008海量数据的高速处理办法,1秒内实现模糊查询并排序
小弟现在做项目遇到个问题,我们需要对一个Text字段进行模糊查询,并且将以匹配的关键字多少进行排序。关键字匹配的越多越靠前。并且一秒内必须实现整个过程。目前我们已经实现了这个功能,但是时间很长,需要20秒。目前测试数据还只有2万条而已。

我把源码发给大家看看。

函数,实现查找某个关键字在某个字段出现的次数。这种方法感觉很不效率。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[getStrCount]
(@str VARCHAR(8000),
@substr VARCHAR(8000)
)
RETURNS INT
BEGIN
RETURN (LEN(@str)-LEN(REPLACE(@str,@substr,'')))/LEN(@substr)
END

查询的SQL语句:
SELECT [字段1] from [表] where [字段1] like '%阿凡达%' order by dbo.getStrCount( [字段1],'阿凡达') desc

------解决方案--------------------
并且一秒内必须实现整个过程?

这个要求怕是太高了,帮顶.
------解决方案--------------------
探讨
并且一秒内必须实现整个过程?

这个要求怕是太高了,帮顶.

------解决方案--------------------
这个问题太难做了,'%阿凡达%'这样的like还不能用索引。
------解决方案--------------------
全文索引
------解决方案--------------------
SQL code
--单独写个函数排序多余SELECT [字段1] from [表] where [字段1] like '%阿凡达%' order by LEN([字段1])-LEN(REPLACE([字段1],'阿凡达',''))/LEN('阿凡达')desc
------解决方案--------------------
仅依靠SQL Server,如果你实现了,我买你的方法。
------解决方案--------------------
你这个不是出现的次数,而是占用的长度大小排序吧

对表建立全文检索
------解决方案--------------------
探讨

全文索引

------解决方案--------------------
SQL SERVER2008 表分区(无限量的分区,不用盘柜,直接使用将内存虚拟成磁盘),也许可以在1s。
------解决方案--------------------
分区有什么用?全文索引是正解
------解决方案--------------------
全文索引。。。
------解决方案--------------------
like 1秒中能做到, 那真是牛人了
------解决方案--------------------
SQL code
SELECT [DomainUrl2]  from [zong] where [DomainUrl2] like '%baidu%' order by (LEN([DomainUrl2])-LEN(REPLACE([DomainUrl2],'baidu','')))/LEN('baidu')desc
------解决方案--------------------
like 是不使用索引的,还是试试全文索引吧
------解决方案--------------------
ding
------解决方案--------------------
用全文检索.很快的
------解决方案--------------------
只有一条路,全文索引
------解决方案--------------------
mark, study now,
------解决方案--------------------
用ISEARCH 淘宝也是用这个的,海量搜索不是单靠SQLSERVER2008的,要靠第三方来实现。
------解决方案--------------------
SQL好象没这样强大的实力哇.
------解决方案--------------------
建立字段的全文索引,使用

SELECT count(*)
FROM table
where contains(g_name,'"集成电路"')

千万记录内基本是秒杀
------解决方案--------------------
SQL code
like是模糊查詢,建議使用sql全文索引試試看,單憑目前需求,在1s內是無法實現的.select ACCOUNT_ID from CQ_JBwhere ACCOUNT_ID like '%28092%'order by LEN(ACCOUNT_ID)-LEN(REPLACE(ACCOUNT_ID,'28092',''))/LEN(ACCOUNT_ID)descsql全文索引2010-04-07 15:41基本知识1. SQL Server7 的 DeskTop 版中没有全文本检索。2. 一个表只能有一个全文本检索。3. 被检索的表必须有单列的唯一索引。4. 全文本的索引存储在文件系统中,而非数据库中。5. 更新全文本索引的过程比常规索引要耗时,而且也不象常规索引那样可以由数据库系统立即更新。6. 全文本索引包含在全文本目录( Full-Text Catalog )中,每个数据库可以包含一个或多个目录,但一个目录不能属于多个数据库。7. 全文本检索只能在真正的表上创建,不能是视图,系统表,临时表。8. 全文本检索会忽略某些噪音字( noise words),比如英文的 a,the,and,中文的'和','是'等等。9. 如果在查询中包含 noise words ,就会引发错误,在应用程序中应去除这些 noise words。启动全文本检索服务。方法A:在企业管理器中打开 Support Services 文件夹,在 Full-Text Search 的右键菜单中选择 Start。方法B:在 SQL Server Service Manager 的 Services 下拉列表中选择 Microsoft Search,并单击 Start/Continue 按钮。方法C:使用 net start mssearch 的命令行方式。使用全文本检索向导( Full-Text Indexing Wizard )。step1. 选择被检索的数据库,在 Tools 的菜单中,选择 Full-text Indexing,进入欢迎( Welcome )的屏幕,单击 next。step2. 选择被检索的表,单击 next。step3. 选择唯一索引,单击 next。step4. 选择被索引的列,单击 Add,该列显示在右栏中。单击 next。step5. 选择目录(选择已存在的目录,或创建新的目录),单击 next。step6. 选择或创建 population schedule(可选项),单击 next。step7. 单击 finish。使用 SQL-DMO (以 VB 为例) step1. 在工程的引用中选择 Microsoft SQLDMO Object Library。step2. 创建 SQLServer 对象。Dim objSQL As New SQLDMO.SQLServerobjSQL.Connect "localhost", "sa", ""step3. 创建新的目录,并加入到被索引的数据库目录中。Dim objCatalog As New SQLDMO.FullTextCatalog'使 pubs 为全文本检索的数据库objSQL.Databases("pubs").EnableFullTextCatalogs'创建新的目录objCatalog.Name = "ftcPubsTest"'将新目录加入到目录集合中objSQL.Databases("pubs").FullTextCatalogs.Add objCatalogstep4. 在表上创建全文本索引。Dim objTable As New SQLDMO.Table'指定被索引的表Set objTable = objSQL.Databases("pubs").Tables("authors")'指定目录名和唯一索引名objTable.FullTextCatalogName = "ftcPubsTest"objTable.UniqueIndexForFullText = "UPKCL_auidind"objTable.FullTextIndex = True'指定被索引的列objTable.Columns("au_lname").FullTextIndex = TrueobjTable.Columns("au_fname").FullTextIndex = True'激活该表上的全文本索引objTable.FullTextIndexActive = Truestep5. 启动全文本目录objCatalog.Start SQLDMOFullText_Full使用存储过程step1. 使 pubs 为全文本检索的数据库USE Pubsgosp_fulltext_database 'enable'step2. 创建新的目录sp_fulltext_catalog 'ftcPubsTest','create'step3. 指定被索引的表sp_fulltext_table 'authors','create','ftcPubsTest','UPKCL_auidind'step4. 指定被索引的列sp_fulltext_column 'authors','au_lname','add'sp_fulltext_column 'authors','au_fname','add'step5. 激活该表上的全文本索引sp_fulltext_table 'authors','activate'step6. 启动全文本目录sp_fulltext_catalog 'ftcPubsTest','start_full'CONTAINS 语法我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。1. 查询住址在北京的学生SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'beijing' )remark: beijing是一个单词,要用单引号括起来。2. 查询住址在河北省的学生SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"HEIBEI province"' )remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。3. 查询住址在河北省或北京的学生SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"HEIBEI province" OR beijing' )remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。4. 查询有 '南京路' 字样的地址SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'nanjing NEAR road' )remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。          A NEAR B,就表示条件: A 靠近 B。5. 查询以 '湖' 开头的地址SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, '"hu*"' )remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。          记住是 *,不是 %。6. 类似加权的查询SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。7. 单词的多态查询SELECT student_id,student_nameFROM studentsWHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )remark: 查询将返回包含 'street','streets'等字样的地址。         对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。以上例子都使用英文,不使用中文是因为有的查询方式中文不支持,而且我的计算机是英文系统付:对《全文检索1得质疑》:5. 更新全文本索引的过程比常规索引要耗时,而且也不象常规索引那样可以由数据库系统立即更新。可以立即更新的9. 如果在查询中包含 noise words ,就会引发错误,在应用程序中应去除这些 noise words。不对,查询时会自己过滤掉noise word,只有查询的内容全是noise words时才会出现错误CONTAINSTABLE 语法我们通常在 FROM 子句中使用 CONTAINSTABLE ,就象这样:SELECT * FROM table_name, CONTAINTABLE(fulltext_table,fullText_column,'search condition') WHERE ......。CONTAINSTABLE 在查询方式上与 CONTAINS 几乎一样,所以就不用赘述了。CONTAINSTABLE 返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用。我们看一个例子,比较这两种表的不同。SELECT FT_TBL.student_name,FT_TBL.student_score,KEY_TBL.RANKFROM report AS FT_TBL INNER JOIN     CONTAINSTABLE( student,address,     'ISABOUT (city weight (.8), county wright (.4))' ) AS KEY_TBL     ON FT_TBL.student_id = KEY_TBL.[KEY]ORDER BY KEY_TBL.RANKCONTAINSTABLE 返回的表包含有特殊的两列:KEY,RANK。在第一部分里我们就强调了:被全文索引的表必须有唯一索引。这个唯一的索引列在返回的表中就成为 KEY。我们通常把它作为表连接的条件。在某些网站搜索时,结果中会出现表示匹配程度的数字,RANK 与此类似。它的值在0~1000之间,标识每一行与查询条件的匹配程度,程度越高,RANK 的值大,通常情况下,按照 RANK 的降序排列。FREETEXT 语法FREETEXT 与 CONTAINS 类似,只是没有 CONTAINS 的精度高。在 CONTAINS 中,对查询条件的写法有很多要求,而 FREETEXT 就没有,可以是任意的单词,词组或句子。看下面的例子:SELECT CategoryNameFROM CategoriesWHERE FREETEXT (Description, 'sweetest candy bread and dry meat' )FREETEXTTABLE 语法和 CONTAINSTABLE 一样,FREETEXTTABLE 返回带有 KEY,RANK 的表。举例说明:SELECT FT_TBL.CategoryName,     FT_TBL.Description,    KEY_TBL.RANKFROM Categories AS FT_TBL INNER JOIN    FREETEXTTABLE(Categories, Description,     'sweetest candy bread and dry meat') AS KEY_TBL    ON FT_TBL.CategoryID = KEY_TBL.[KEY]在 ASP 中使用全文本检索Dim cnn Dim rsDim strSQLstrSQL = "SELECT book_name " &_         "FROM books " &_         "WHERE CONTAINS( description, '" & Request("search_condition") & "' )"Set cnn = Server.CreateObject("ADODB.Connection")Set rs = Server.CreateObject("ADODB.RecordSet")cnn.Open "provider=sqloledb;datasource=.;initial catalog=books;user id=sa;pasword=;"rs.Open strSQL,cnn
  相关解决方案