【发布时间】:2018-06-17 21:45:01
【问题描述】:
假设我有一个包含 300 万行的表,该表没有 PK 也没有索引。
查询如下
SELECT SKU, Store, ColumnA, ColumnB, ColumnC
FROM myTable
WHERE (SKU IN (select * from splitString(@skus)) OR @skus IS NULL)
AND (Store IN (select * from splitString(@stores)) OR @stores IS NULL)
请考虑@sku 和@store 是NVARCHAR(MAX),其中包含以逗号分隔的ID 列表。
SplitString 是一个函数,它将格式为 '1,2,3' 的字符串转换为 1 列 3 行的表格,如下图所示。
此模式允许我从应用程序发送参数并按 sku 或按商店或两者或无过滤。
我可以做些什么来提高这个查询的性能? - 我知道索引是一个好主意,但我真的不知道那些东西,所以对此的指导会有所帮助。 还有其他想法吗?
【问题讨论】:
-
尝试使用存在...此代码 WHERE (SKU IN (select * won't event work
-
@hatchet 你能详细说明你的答案吗,我不太明白你在说什么以及为什么重要
-
您不能指望对具有数百万条记录的未索引表运行查询并获得可观的结果...索引您的表。
-
使用执行计划来优化您的查询性能和尽可能避免使用 OR 运算符,阅读更多相关信息ubitsoft.com/help_19/html/…
-
另外,您应该考虑表而不是创建表的函数。如果可能,请反向执行工作,这意味着您可以创建一个永久表并使用存储过程控制它,并修改您的应用程序以将所有数据插入该表中,因此应用程序只会在数据库和任何数据之间同步另一端。然后,您可以索引您的表并提高它们的性能。
标签: sql-server tsql