已为我提供了一个程序,用于改善某些代码(使用MS Visual Studio和Microsoft SQL Server Management Studio的VB.Net和SQL查询)的SQL性能。
(如果您不想通读文字,我总结的问题在这篇文章的底部)
我们还使用SQL Server Profiler监视每个查询的读取次数和持续时间。这是一个非常简单的程序,只有两个屏幕(尽管它已经被抽象了很多,以使我们适应将要使用的主要客户端)。我希望获得一些见识/指标来完成此任务(我是一名实习生)。例如,SQL查询直接写在MS Visual Studio的VB.Net类中。似乎有8个类,其中数据访问类似乎包含SQL查询,数据类仅包含数据对象,等等。
ScaleTraining.DataAccess.Common
ScaleTraining.DataAccess.Client
ScaleTraining.DataAccess.Policy
ScaleTraining.Data.Client
ScaleTraining.Data.Policy
ScaleTraining.Business.Client
ScaleTraining.Business.Policy
ScaleTraining.UI
这是一个基本的保险单用户界面程序,可以从数据库中搜索用户,然后您可以查看其保单。
基本的主屏幕允许您通过以下方式定位:帐户名称或查阅代码,还可以使用包含或开头为< / strong> SQL查询。
下面运行的主要SQL查询如下,只有'sWhereClause'(作为参数传递到Fetch函数中)才会更改,具体取决于查找依据
旁边的组合框中选择的内容>Private Function Fetch(ByVal sWhereClause As String) As DataTable
Dim sSQL As String = " SELECT c.uniqentity, c.lookupcode, c.nameof, " & _
" c.flags, a.address1, a.address2, " & _
" a.city, a.cdstatecode, a.postalcode " & _
" FROM client c " & _
" INNER JOIN contactaddress a ON a.uniqcontactaddress = c.uniqcontactaddressaccount " & _
sWhereClause
Return ExecuteDataTable(sSQL)
End Function
当您单击唯一的实体并单击“策略”按钮时,SQL查询运行如下。它将包含客户端ID的整数作为参数。
Public Function Fetch(ByVal iEntityID As Integer) As DataTable
Dim sSQL As String = " SELECT p.uniqpolicy, l.uniqline, t.cdpolicylinetypecode AS line, " & _
" c.descriptionof AS statusdescription, p.effectivedate, " & _
" p.expirationdate, p.policynumber, p.descriptionof AS policydescription " & _
" FROM policy p " & _
" INNER JOIN line l ON l.uniqpolicy = p.uniqpolicy " & _
" INNER JOIN cdpolicylinetype t ON t.uniqcdpolicylinetype = l.uniqcdpolicylinetype " & _
" INNER JOIN cdlinestatus c ON c.uniqcdlinestatus = l.uniqcdlinestatus " & _
" WHERE p.uniqentity = " & iEntityID
Return ExecuteDataTable(sSQL)
End Function
在这里,当您单击策略或行时,似乎正在运行2个SQL查询。似乎第一个SQL查询查询策略详细信息(左下角附近的子窗口),另一个查询行详细信息(右下角附近的子窗口):
Public Function FetchPolicyDetail(ByVal iLineID As Integer) As DataTable
Dim sSQL As String = " SELECT p.uniqpolicy, p.billedcommission, p.billedpremium, " & _
" p.annualizedcommission, p.annualizedpremium " & _
" FROM policy p " & _
" INNER JOIN line l ON l.uniqpolicy = p.uniqpolicy " & _
" WHERE l.uniqline = " & iLineID
Return ExecuteDataTable(sSQL)
End Function
Public Function FetchLineDetail(ByVal iLineID As Integer) As DataTable
Dim sSQL As String = " SELECT l.uniqline, l.cdstatecodeissuing AS issuingstate, " & _
" l.contactnamebillto, l.address1billto, l.address2billto, " & _
" l.address3billto, l.citybillto, l.cdstatecodebillto, " & _
" l.postalcodebillto, l.countybillto, l.cdcountrycodebillto, " & _
" l.email, l.fax, l.faxextension, " & _
" c.cdpolicylinetypecode, f.descriptionof AS formcategory, " & _
" b.nameof AS billingcompany, i.nameof AS issuingcompany " & _
" FROM line l " & _
" INNER JOIN cdpolicylinetype c ON c.uniqcdpolicylinetype = l.uniqcdpolicylinetype " & _
" INNER JOIN formcategory f ON f.uniqformcategory = l.uniqformcategory " & _
" INNER JOIN company b ON b.uniqentity = l.uniqentitycompanybilling " & _
" INNER JOIN company i ON i.uniqentity = l.uniqentitycompanyissuing " & _
" WHERE l.uniqline = " & iLineID
Return ExecuteDataTable(sSQL)
End Function
我不想要任何答案,但是希望获得一些有关如何优化SQL查询的指示。
例如,我可以问一些更直接的问题:
1。 “循环查询”是什么意思?它的字面意思是在SQL中使用WHILE循环,还是仅在可以通过使用JOINS进行优化的情况下单独运行的查询?
此外,我还得到了一些类似的指针:
请勿在并非本应用于屏幕的屏幕上重复使用数据访问方法 -重用它们通常意味着查询将返回比您需要更多的数据和使用更多的联接
和
不要将数据类的设计限制为数据库模式 -如果一个数据类可以智能地表示来自两个表的数据并将两个SQL查询简化为一个,则可以这样做。
当心嵌套子查询,因为它们的作用类似于联接