使用全文搜索调整简单查询

时间:2013-12-23 11:44:00

标签: sql query-optimization

我想用全文搜索来调整我的查询。

我有两张桌子:

  1. artaolInventTable

    a)IT_NAMEIDIDX(唯一,非群集)

    • 的itemId
    • ITEMNAME (包括专栏

    b)IT_IMPORTIDX(非唯一,非群集)

    • importIndex

    c)IT_ITEMNAMEIDX(唯一,群集)

    • ITEMNAME

    d)PK_ARTAOLINVENTTABLE(唯一,非群集)

    • 的itemId
  2. InventSumIntegration_ART

    a)IS_AVAILIDX(非唯一,非群集)

    • availphysical

    b)IS_ITEMIDX(唯一,聚集)

    • 的itemId
    • availphysical
  3. 首先我有简单的查询:

    查询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 ms,经过时间= 205 ms。

    执行计划看起来不错。查找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 ms,经过时间= 51756 ms。

1 个答案:

答案 0 :(得分:0)

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