【发布时间】:2015-08-01 11:11:43
【问题描述】:
我越来越意识到提高查询效率的重要性。至关重要的是,我拥有适当的索引等,以确保我的查询不会占用比实际需要更多的 IO。但这是一个丑陋的查询,我不知道如何提高效率。
假设我有一个库存商品表,其最基本的形式如下所示:
CREATE TABLE StockItems (
ItemID INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
SerialNo VARCHAR (50) NOT NULL
);
现在我需要编写一个存储过程,它将返回序列号与提供的部分序列号匹配的所有库存项目。以下查询将完全实现:
SELECT * FROM StockItems WHERE SerialNo LIKE '%' + @SearchStr + '%'
但是当我看到这样的问题时,我冷汗直冒,把我的舒适毯子抓得更紧了。 SerialNo 上没有索引,即使有,考虑到我正在搜索部分匹配项,这也无济于事。
有没有办法通过更高效的查询来完成这项任务?
【问题讨论】:
-
如果您希望它是部分匹配,恐怕没有其他方法可以做到这一点(那会更有效)。
-
有很多方法可以优化这样的查询,但实际上并没有那么多只涉及在表上塞入某种内置索引类型。例如,您可以将书名分解为所有单词,删除干扰词(the、and、or 等)并存储一个包含这些单词的单独表格,并将它们链接到包含这些单词的所有书名。然后,您将首先对这些行进行查询,然后使用 LIKE 表达式来获得正确的部分匹配。
-
这些场景当然是有效的,如果你能够实现
Full-text Index,你可以提高查询性能:msdn.microsoft.com/en-us/library/… 和technet.microsoft.com/en-us/library/ms187787(v=sql.105).aspx -
Amazon 和人们通常使用全文索引——这与搜索完全匹配的部分不同(例如,您可以在“照顾树木”中找到“tree”,但不能在“tre”中找到或“汽车”)。如果您能想到任何分区,您可以添加自己的分区 - 但
like '%XXX%'几乎不可能以任何有意义的方式进行索引。并且索引仍然可以帮助 I/O——而不是遍历表中的所有数据,它只需要扫描索引——如果索引比表小得多,这是值得的。但仅此而已。%XX和XX%都很好,但%XX%很疯狂。
标签: sql sql-server