2013-12-23 15 views
0

我想用全文搜索调整我的查询。使用全文搜索调整简单查询

我有两个表:

  1. artaolInventTable

    一个)IT_NAMEIDIDX(唯一的,非群集)

    • 的itemId
    • ITEMNAME (包括柱

    B)IT_IMPORTIDX(非唯一的,非群集)

    • importIndex

    C)IT_ITEMNAMEIDX(唯一的,群集)

    • ITEMNAME

    d) PK_ARTAOLINVENTTABLE(唯一,非群集)

    • 的itemId
  2. InventSumIntegration_ART

    一个)IS_AVAILIDX(非唯一的,非聚集)

    • availphysical

    B)IS_ITEMIDX(唯一的聚簇)

    • 的itemId
    • availphysical

首先我简单查询:

查询1

SELECT 
    it.ItemId, it.ItemName, it.ItemBrand, it.Amount, it.salesunit, it.importIndex 
FROM 
    artaolInventTable IT 
WHERE 
    (CONTAINS(it.ItemName, '("Papier*" OR FORMSOF(THESAURUS, Papier)) AND ("ksero*" OR FORMSOF(THESAURUS, ksero)) AND ("A4*" OR FORMSOF(THESAURUS, A4))') 
OR it.importIndex = 'IP000' OR it.ItemId = 'aaaa') 
ORDER BY 
    it.ItemName 

CPU时间= 32毫秒,经过时间= 205毫秒。

执行计划看起来不错。在where子句中查找SQL Server使用索引的每个条件。

我加了第二张表,我的执行时间增加到了51秒!为什么?我的索引有问题吗?我应该如何构建它?

INVENTSUMSHOPINTEGRATION发明了股票价值。

查询2

SELECT 
    IT.ITEMID, IT.ITEMNAME, IT.ITEMBRAND, IT.AMOUNT, IT.SALESUNIT, IT.ImportIndex, 
    ISU.AVAILPHYSICAL 
FROM 
    ARTAOLINVENTTABLE IT 
JOIN 
    INVENTSUMSHOPINTEGRATION_ART ISU ON ISU.ITEMID = IT.ITEMID 
WHERE 
    (CONTAINS(IT.ITEMNAME, '("Papier*" OR FORMSOF(THESAURUS, Papier)) AND ("ksero*" OR FORMSOF(THESAURUS, ksero)) AND ("A4*" OR FORMSOF(THESAURUS, A4))') 
OR IT.IMPORTINDEX = 'IP000' OR IT.ITEMID = 'aaaa') AND (ISU.AVAILPHYSICAL >= 0) 
ORDER BY 
    it.ITEMNAME 

CPU时间= 51418毫秒,经过时间= 51756毫秒。

回答

0

不要这样做!数据库是一个非常糟糕的地方进行搜索。数据库应该存储数据而不搜索数据。在企业数据库中,您可以为全文搜索引擎付费并且没关系。但不要使用像mysql或postgresql这样的数据库的完整搜索。看外部搜索引擎,如Lucene(java)Solr(java,在lucene之上)或非常快的搜索引擎Sphinx(C++)。所有API都有你喜欢的语言。 Solr使用Apache Tika来查看word或excel等文档。如果你使用Hibernate并且Lucene对你来说已经足够了,那么看看Hibernate-Search--这会让许多事情变得更容易。如果您无法安装/设置您最喜爱的搜索引擎,请尝试以您最喜欢的语言编写的应用程序。对于PHP看看my answer

+0

我忘了写我使用MS SQL 2008R2。全文搜索是SQL SERVER引擎的一部分。 我必须使用.net 2.0,所以我有问题使用lastes库。 – Lutador

+0

我对MS-World不熟悉。但以我的经验来看,联盟的或者糟糕的索引是性能杀手。有时临时表可以提高你的表现。尝试将第一个查询放在临时表中,然后使用INVENTSUMSHOPINTEGRATION_ART进行过滤。 –