我想用全文搜索来调整我的查询。
我有两张桌子:
artaolInventTable
a)IT_NAMEIDIDX(唯一,非群集)
b)IT_IMPORTIDX(非唯一,非群集)
c)IT_ITEMNAMEIDX(唯一,群集)
d)PK_ARTAOLINVENTTABLE(唯一,非群集)
InventSumIntegration_ART
a)IS_AVAILIDX(非唯一,非群集)
b)IS_ITEMIDX(唯一,聚集)
首先我有简单的查询:
查询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。
答案 0 :(得分:0)
不要这样做!数据库是一个非常糟糕的搜索地点。数据库应该存储数据而不是搜索数据。在企业数据库中,您可以为全文搜索引擎付费,这没关系。但是不要使用mysql或postgresql等数据库的完整搜索。查看外部搜索引擎,如Lucene(java)Solr(java,在lucene之上)或非常快速的搜索引擎Sphinx(c ++)。所有人都有自己喜欢的语言的API。 Solr使用Apache Tika查看word或excel等文档。如果您使用Hibernate并且Lucene对您来说已经足够了,请查看Hibernate-Search - 这会让很多事情变得更容易。如果您无法安装/设置自己喜欢的搜索引擎,请尝试使用您喜欢的语言编写的应用程序。对于php,请查看my answer。