- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 SQL Azure 数据库,其中有两个主表,我试图通过 View 连接这两个表。我已经可以运行了,但是执行时间超过了 2 分钟。
以下是我正在处理的主要表格和列:
交易表:
PostedDate | EmployeeFirstName | EmployeeLastName | DollarsCollected | UserName
---------------------------------------------------------------------------------------------
09/08/2017 09:05 am | 'John' | 'Smith' | 42.25 | 'john.smith'
09/08/2017 09:07 am | 'Jane' | 'Jones' | 58.50 | 'jane.jones'
09/08/2017 09:15 am | 'Tom' | 'Holland' | 62.75 | 'tom.holland'
09/08/2017 09:17 am | 'John' | 'Smith' | 48.50 | 'john.smith'
09/08/2017 09:19 am | 'Jane' | 'Jones' | 32.25 | 'jane.jones'
客户历史记录
CustomerID | StartDate | Duration | UserName | TransactionType
-----------------------------------------------------------------------------
1 | 09/08/2017 09:02 am | 600 | 'john.smit'h | 'PropertyTax'
2 | 09/08/2017 09:03 am | 500 | 'tom.holland' | 'TagRenewal'
3 | 09/08/2017 09:04 am | 450 | 'jane.jones' | 'PropertyTax'
4 | 09/08/2017 09:12 am | 700 | 'john.smith' | 'TagRenewal'
5 | 09/08/2017 09:16 am | 300 | 'jane.jones' | 'TagRenewal'
因此,这里的协议(protocol)是 - 一名员工一次只能接待一名客户。如果我们知道交易发布的时间以及发布该交易的员工,那么我们应该能够使用StartDate
将该信息连接到 CustomerHistory 表。和StartDate + Duration
作为总交易的“保护伞”。考虑StartDate + Duration
等于 EndDate
。因此,这是我尝试运行来完成此任务的查询:
SELECT
*
FROM
CustomerHistory
JOIN TransactionsTable ON
CustomerHistory.UserName = TransactionsTable.UserName
AND
TransactionsTable.PostedDate >= CustomerHistory.StartDate
AND
TransactionsTable.PostedDate <= DATEADD( ss, CustomerHistory.StartDate, CustomerHistory.Duration )
作为引用,我在 UserName
上有索引字段以及日期字段。可以说我在这里过度简化了我的表,因为我希望加入每个表中更多的数据列。我在SQL Server中运行了执行计划,它告诉我哈希匹配将花费大约38%的执行时间,而对事务表的表扫描将花费42%。我对 SQL 很熟悉,但从未深入研究过像我在这里处理的资源密集型查询,并且它给我的服务器带来了相当大的负载,试图以这种方式运行它。
有人可以帮忙吗?
最佳答案
加速很困难,因为您的查询是不可SARGable的。我相信添加持久计算列应该非常适合您的查询。不过,您需要阅读它,因为这可能会减慢 DML(插入、更新和删除)。
我的表创建脚本供引用(SQL Fiddle http://sqlfiddle.com/#!6/f1a39/8 ):
Create Table dbo.TransactionsTable
(
PostedDate Datetime,
EmployeeFirstName Varchar(100),
EmployeeLastName Varchar(100),
DollarsCollected Money,
UserName Varchar(100)
);
Create Table dbo.CustomerHistory
(
CustomerID Int,
StartDate DateTime,
Duration Int,
UserName Varchar(100),
TransactionType Varchar(100)
);
Insert Into dbo.TransactionsTable
Values
('09/08/2017 09:05 am','John','Smith',42.25 , 'john.smith'),
('09/08/2017 09:07 am','Jane','Jones',58.50 , 'jane.jones'),
('09/08/2017 09:15 am','Tom','Holland',62.75 , 'tom.holland'),
('09/08/2017 09:17 am','John','Smith',48.50 , 'john.smith'),
('09/08/2017 09:19 am','Jane','Jones',32.25 , 'jane.jones');
GO
Insert Into dbo.CustomerHistory
Values (1,'09/08/2017 09:02 am',600,'john.smith' ,'PropertyTax'),
(2,'09/08/2017 09:03 am',500,'tom.holland','TagRenewal'),
(3,'09/08/2017 09:04 am',450,'jane.jones','PropertyTax'),
(4,'09/08/2017 09:12 am',700,'john.smith','TagRenewal'),
(5,'09/08/2017 09:16 am',300,'jane.jones','TagRenewal');
Go
确保您有此索引。
CREATE NONCLUSTERED INDEX ix_test1
ON TransactionsTable(UserName,PostedDate)
Include (EmployeeFirstName,EmployeeLastName,DollarsCollected);
GO
对于客户历史记录,您可以添加持久列吗?然后索引该列
Alter Table CustomerHistory
Add EndDate As (DateAdd(ss,Duration,StartDate)) Persisted;
GO
CREATE NONCLUSTERED INDEX ix_test2
ON CustomerHistory(UserName,StartDate,EndDate)
Include(CustomerID,TransactionType);
GO
这是查询
SELECT *
FROM CustomerHistory AS A
INNER JOIN TransactionsTable AS B
ON A.UserName = B.UserName
AND B.PostedDate Between A.StartDate And A.EndDate;
关于sql-server - 日期之间和基于员工姓名的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46289204/
我希望通过 Workday API 检索 Workday 工作人员(又名员工)Web 配置文件 URL。用例是我正在构建一个聊天机器人来检索用户信息,并且我希望能够深度链接到工作人员(员工)网络配置文
我很困惑我希望员工 ID 是自动生成的前缀格式我知道在 sql server 中触发之前是可能的我正在关注帖子 http://www.aspdotnet-suresh.com/2012/04/set-
我读了一个教程,其中有这个结构: struct { char Name[25]; int Age; float SkillRating; } Employee; defines
我有两个表 employee(name,id) ,其中包含所有员工和另一个表 reader(id,date) ,它给出了日期和哪个员工在场。我如何找到一定范围内的缺席者列表日期? 对于特定日期,我能够
我需要员工 ID 的标准正则表达式,例如 EMP015 015EMP EMP_015 E_015 EMP-015 EMP.VIS EMP/056 基本上它应该允许 . 或 _ 或 - 或 / 在字母数
我是 Angular 的新手,正在使用 Angular 编写代码,我正在观看视频教程。我注意到我的代码中有一些东西,但我无法理解它是如何工作的。 我想知道这段代码是什么意思组件上的“员工:员工 []”
下面从HR角度,来分析员工离职成本,欢迎大家留言讨论。 一个员工离职后留下的坑,并不是再找一个人填上就万事大吉了。 一般来说,核心人才的流失,至少有1-2个月的招聘期、3个月的适应期,6个月的融入期;
我有两个表 Employee 和 Department 此图像显示每个员工的经理。我想编写一个 SQL 查询,为我提供所有主管(经理、经理的经理......)的列表。 我只想要一个列,在给定特定员工时
我想将 ER 图的这一部分转换为关系模型。我们有一个三元关系,它说的是以下内容: 1 位客户将 1 个项目提供给 -> 多个开发人员 1 位客户分配给 1 位开发人员 -> 多个项目 1 个开发人员被
我将要开发一个应用程序,该应用程序将使用一些基于 SOAP 的 Web 服务框架。我做了一些研究,我有点喜欢 Axis2C 框架,但在某些主题中,我发现原来的 Axis2C 实现存在内存泄漏问题,并且
我的 SQL 数据库中有两个表: 公司: ID(自增) 姓名 地址 ... 员工: ID(自增) 公司编号 internal_id 姓名 姓氏 问题是我想要一个与他们所属的公司相关的员工 ID (in
我试图在堆栈溢出和谷歌上找到这个问题的答案,但没有找到。如果有问题需要更正或重复问题,请告诉我。 当我计算员工对象 (emp_obj) 和员工类的大小时,在这两种情况下我都得到了 4 个字节。但是我不
问题 如何在 Angular 员工 component.html 上返回 EmployeeCode ? 示例数据引用表 Code tableName FieldName LabelText
我是 hibernate 新手,正在使用 hibernate 版本 4.3.4 JAR 文件。我正在尝试使用 intelliJ 社区版中的 mySQL 服务器执行简单的 Hibernate 程序。以下
我正在使用 laravel 5.4 和 Yajra Datatable,但我无法使其工作..我遇到了“Uncaught TypeError: $(...).DataTable is not a fun
我想创建一个小型示例应用程序,它可以读取我的员工徽章并将其显示在屏幕上(或者如果我可以复制它就更好了,这样我们就可以使用我们的手机徽章而不是我们的塑料身份证) 几个问题1. 这在技术上可行吗?如果是这
我有一个 person 对象,需要将它存储为 byte[] 并再次检索该 byte[] 并转换为 person 对象 并且 BinaryFormatter 在 Silverlight 中不可用 最佳答
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
当我执行以下命令来创建分片时: mysqlfabric sharding add_table 1 employees.employees emp_no 我收到以下错误: DatabaseError:
这是我的表格 门票 tic_id, tic_cat tic_priority tic_cus tic_date tic_title tic_
我是一名优秀的程序员,十分优秀!