版本:SQL Server 2008 R2
数据库:来自http://msftdbprodsamples.codeplex.com/releases/view/55926的 AdventureWorks 2008R2
查询:
SELECT TOP 10
*
FROM
Person.Person --WITH (FORCESEEK)
WHERE
LastName like 'Max%'
OR EXISTS (
SELECT
1
FROM
Person.PersonPhone
WHERE
Person.PersonPhone.BusinessEntityID = Person.Person.BusinessEntityID
AND Person.PersonPhone.PhoneNumber LIKE '122%'
)
ORDER BY Person.Person.BusinessEntityID DESC
Run Code Online (Sandbox Code Playgroud)
没有任何查询提示,SQL Server将使用聚合索引扫描,这是IO密集型:
Table 'PersonPhone'. Scan count 14170, logical reads 28446, physical reads 15, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 1, logical reads 2844, physical reads 3, …Run Code Online (Sandbox Code Playgroud) 我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示.我明白它是如何工作的.
不过,我有个问题在那里,并在使用它.它不能在UDF中指定.它可以在存储过程中指定.但是,这篇 MSDN博客文章陈述如下:
4.将查询移入存储过程可以将其置于单独的过程上下文中,并且可以是优化器可以看到该值的好方法(注意:这也适用于SQL 2000)
在我看来,传递给存储过程的任何参数都将被"嗅探",从而帮助SQL Server编译最佳执行计划.这意味着将重新访问/重新编译缓存的计划(不确定该机制).然而,这是令人困惑的,因为它否定了OPTIMIZE FOR UNKNOWN的全部需求.
关于查询提示的MSDN文章没有涵盖我的问题.
有人可以为我解答这个问题,理想情况下是指向微软的一些东西来解决这个问题.谢谢.
给定一个表上有两个索引,一个表从另一个表中反向排序并给出这两个查询.
Select value From SomeTable wITH (INDEX(IV_Sort_Asc))
Select value From SomeTable wITH (INDEX(IV_Sort_Desc))
Run Code Online (Sandbox Code Playgroud)
我在SQL Server 2008中遇到了一个忽略提示的案例,在这两种情况下IV_Sort_Desc都使用索引而不是第一个.
我意识到很多人会立即建议不提供提示,但鉴于我的具体情况,这不是一个选择.
什么会导致这种情况,我该怎么做才能解决它?当然你会期望SQL Server尊重索引提示而不是使用不同的索引提示?
我有一个背景可绘制的搜索视图,但无论我尝试什么,我似乎都无法显示文本.SearchView中没有文字显示.
我已经尝试过android:text,android:queryHint甚至以编程方式设置它,mSearchView.setQueryHintText("search for something");但这些都没有.searchView不在actionBar中.
这是searchview的xml
<android.support.v7.widget.SearchView
android:id="@+id/m_search_view"
android:layout_width="match_parent"
android:layout_height="@dimen/searchbar_height"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@+id/other_button"
android:background="@drawable/rounded_corner_box"
android:focusableInTouchMode="true"
android:gravity="center_vertical|left"
android:paddingLeft="@dimen/left_padding"
android:queryHint="search for something"
android:textAppearance="@style/m_text_appearance"
android:textColor="@color/m_text_color" />
Run Code Online (Sandbox Code Playgroud)
当我没有设置背景时,我根本看不到searchView(searchView是半透明的).
任何帮助,将不胜感激.
我有一个查询返回错误超过最大递归级别.
我知道如何通过添加OPTION (maxrecursion 0)到查询来解决这个问题,但我已经尝试在查询中的各个位置添加它,我无法找到将其放在语法有效的位置.
任何人都可以给我任何关于在我的视图中需要插入查询提示的指针吗?
/****** Object: View [dbo].[SiconCFMContractLinesDetailByDayView] Script Date: 16/12/2016 12:02:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[SiconCFMContractLinesDetailByDayView]
AS
WITH dateRange as
(
SELECT [Date] = DATEADD(dd, 1, DATEADD(dd, -1,[SiconCFMContractLinesOutstandingView].[NextDueDate])),
[Frequency] = [SiconCFMContractLinesOutstandingView].[FrequencyValue],
[EndDate] = DATEADD(yy,5, [SiconCFMContractLinesOutstandingView].[NextDueDate]),
[SiconCFMContractLinesOutstandingView].[SiconContractLineID]
FROM [SiconCFMContractLinesOutstandingView]
WHERE DATEADD(mm, [SiconCFMContractLinesOutstandingView].[FrequencyValue], [SiconCFMContractLinesOutstandingView].[NextDueDate]) < DATEADD(mm, [SiconCFMContractLinesOutstandingView].[FrequencyValue], DATEADD(yy,5, [SiconCFMContractLinesOutstandingView].[NextDueDate]))
UNION ALL
SELECT DATEADD(mm, [Frequency], [Date]) [Date],
[Frequency],
[EndDate],
[SiconContractLineID]
FROM dateRange
WHERE DATEADD(mm, [Frequency], [Date]) < DATEADD(mm, [Frequency],[EndDate])
)
SELECT
( …Run Code Online (Sandbox Code Playgroud) 最近我研究了 SQL 服务器中的提示和锁。虽然谷歌关于这个话题,我读过一个博客,其中写了一些我不太理解的查询。这里是
BOL 状态:在读取表时使用更新锁而不是共享锁,并保持锁直到语句或事务结束。我在翻译这个时遇到了一些麻烦。这是否意味着在执行 SELECT 语句后会释放更新锁,除非 SELECT 语句在事务内?
换句话说,我在以下两种情况下的假设是否正确?
场景一:没有交易
SELECT something FROM table WITH (UPDLOCK)
/* update locks released */
Run Code Online (Sandbox Code Playgroud)
场景二:有交易
BEGIN TRANSACTION
SELECT something FROM table WITH (UPDLOCK)
/* some code, including an UPDATE */
COMMIT TRANSACTION
/* update locks released */
Run Code Online (Sandbox Code Playgroud)
场景 2 的示例(参考 stackoverflow 博客)
BEGIN TRAN
SELECT Id FROM Table1 WITH (UPDLOCK)
WHERE AlertDate IS NULL;
UPDATE Table1 SET AlertDate = getutcdate()
WHERE AlertDate IS NULL;
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
请帮助理解上述查询。
我的第二个问题是:一旦同时完成 select 语句的执行,是否UPDLOCK被释放?
sql-server locking transactions database-administration query-hints
我有一个复杂的 Oracle 查询。
SELECT
r3.object_id
FROM
nc_references r
INNER JOIN nc_objects o ON r.object_id = o.object_id
AND o.object_class_id = 90000330 /* Work Item */
INNER JOIN nc_params p ON p.object_id = o.object_id
AND p.attr_id = 90100070 /* State */ AND p.list_value_id IN ( 90100071 /* Ready */, 90100072 /* Active */ )
INNER JOIN nc_po_actions poa ON poa.manual_task_id = o.object_id
INNER JOIN nc_po_tasks pot ON pot.task_id = poa.task_id
INNER JOIN nc_references r1 ON r1.object_id = pot.container_id
AND r1.attr_id = 9145923960313063683 …Run Code Online (Sandbox Code Playgroud) query-hints ×7
sql-server ×4
sql ×3
indexing ×2
android ×1
locking ×1
oracle ×1
oracle11g ×1
searchview ×1
transactions ×1