sql-server - SQL:就性能而言,一行中的逗号分隔字符串 V/S 多行单列
问题描述
我在下面有一张签名表
"tblProperties"
ID int,
DocID int,
PNAME varchar(50),
PVALUE varchar(max),
PType varchar(50),
Users varchar(max)
和
索引
create index InxUsers on tblProperties(Users);
create index InxPValue on tblProperties(PVALUE);
create index InxPrDocID on tblProperties(DocID);
这Users
是用户的逗号分隔的电子邮件地址。我在表上执行不同的选择查询,例如
SELECT DocID
FROM tblProperties
WHERE PNAME = 'AssignDocument'
AND PVALUE LIKE '%abc%'
AND Users LIKE '%ankit@gmail.com%';
为了达到最佳性能,我应该将上表拆分为以下两个表
1) "tblProperties"
ID int,
DocID int,
PNAME varchar(50),
PVALUE varchar(max),
PType varchar(50)
2) "tblUsersDocument"
ID int,
DocID int,
User varchar(320)
和索引
create index InxUsers on tblProperties(Users);
create index InxPValue on tblProperties(PVALUE);
create index InxUseEmail on tblUsersDocument(User);
create index InxDocID on tblUsersDocument(DocID);
create index InxPrDocID on tblProperties(DocID);
并且选择查询是
SELECT p.DocID
FROM tblProperties AS p inner join tblUsersDocument AS u
on p.DocID = u.DocID
WHERE p.PNAME = 'AssignDocument'
AND p.PVALUE LIKE '%abc%'
AND u.User = 'ankit@gmail.com';
在性能方面,第一个或第二个哪个更好?
我已经SHOWPLAN_XML
在单批次中测试过,第一个给出 25%,第二个给出 75% 的查询成本。
解决方案
推荐阅读
- javascript - 从引荐来源网址解析
- python - Matplotlib 倒钩作为时间与高度的函数 - 未知错误
- php - CLI 输出在本地显示 �,但在服务器上工作正常
- cplex - VRP中的二元决策变量约束问题
- javascript - 在移动 Outlook 客户端中获取 SSO 令牌
- symfony - 在 Symfony Insight 中使用 Redis
- php - 在 PHP 中解析和处理 HTML:使用刮刀获取 Wordpress-plugin-Metadata
- apache-spark - “插入 SparkSession 数据帧”不存在 - IBM Watson 工作室
- google-cloud-platform - 有没有办法加载 GCS 文件而不是先下载它然后用你的编程语言打开它
- javascript - 在 iframe javascript 中隐藏/显示元素外部页面