sql-server-2012 - SQL:改进字符串拆分
问题描述
我有一组代码,它接受一个字符串值,拆分它,然后将它传递给一个表。该代码有效,但运行缓慢。任何修改代码并使其运行更快的建议将不胜感激。
DECLARE @StrPropertyIDs VARCHAR(1000)
SET @StrPropertyIDs = '419,429,459'
DECLARE @TblPropertyID TABLE
(
property_id varchar(100)
)
INSERT INTO @TblPropertyID(property_id)
select x.Item
from dbo.SplitString(@StrPropertyIDs, ',') x
select *
from vw_nfpa_firstArv_RPT
where property_use IN
(
SELECT property_id
FROM @TblPropertyID
)
解决方案
如果可能的话,最好的长期策略是远离 SQL 表中的 CSV 数据。作为这里的快速修复,我们可以尝试使用索引创建表变量property_id
:
DECLARE @TblPropertyID TABLE (
property_id varchar(100) INDEX idx CLUSTERED
);
这将使WHERE IN
您的查询子句更快,尽管我们可以尝试使用以下方法重写它EXISTS
:
SELECT *
FROM vw_nfpa_firstArv_RPT t1
WHERE EXISTS (SELECT 1 FROM @TblPropertyID t2
WHERE t2.property_id = t1.property_use);
请注意,这仅适用于 SQL Server 2014 或更高版本。
推荐阅读
- machine-learning - Tensorflow 联合图像分类示例#Epochs 具有重大影响。模型是否过拟合?
- swift - 可重现:didRegisterForRemoteNotificationsWithDeviceToken 随机停止被调用
- c# - 具有基本身份验证的 Exchange Online 和 EWS 停止工作
- reactjs - 调用钩子函数以显示传入参数的钩子实例
- python-3.x - 根据熊猫数据框中的唯一性对两列值的组合进行编号
- angular - div元素中的角度点击事件不起作用
- sql - Postgesql:加入或子查询问题
- node.js - 在 Docker 中构建 Angular 会引发“文件替换中的 environment.prod.ts 路径不存在”
- laravel - 在应用程序\用户 laravel 7 中找不到方法“创建”
- c - 为什么第二条语句创建分配给非左值''main.c?