代码之家  ›  专栏  ›  技术社区  ›  Michael Pliskin

LINQ实体摆脱sp\u executesql

  •  3
  • Michael Pliskin  · 技术社区  · 14 年前

    Database Engine Tuning Advisor ,我面临的问题是,我的SQL Profiler跟踪显示使用 sp_executesql -顾问无法处理这些。这些查询似乎来自我正在使用的linqto实体,所以很好奇是否有任何方法可以让linqto实体直接调用语句。

    4 回复  |  直到 14 年前
        1
  •  4
  •   ram    14 年前

    同意亚当的观点。使用 sp_executesql

    如果您希望优化数据库,那么也应该考虑这些查询。我建议您备份数据库,使用replay跟踪模板捕获查询(在SQL profiler中),恢复数据库,运行tuning advisor设置,并将其工作负载设置为此跟踪

        2
  •  6
  •   Fredrik Johansson    12 年前

    sp_executesql 调用SQL server。然而, 数据库引擎优化顾问 事件探查器 ,因此优化会话的结果将很差。

    sp\u执行SQL 语句,以便它能够正确地分析它们。

    1. 在中运行(或打开现有)优化会话后 事件探查器 ,使用 保存包含所有SQL语句的.SQL文件。
    2. 打开.SQL文件(例如。 - http://notepad-plus-plus.org/ )并运行以下查找;替换正则表达式以全部取消装箱 sp\u执行SQL 对普通TSQL的语句。查找: ^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$ 替换: BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
    3. 数据库引擎优化顾问 找出需要添加的索引。

    调音愉快!请注意,我选择了Notepad++6(或更高版本),因为它有一个非常好的正则表达式实现,其他texteditors可能无法运行上面的表达式。

        3
  •  3
  •   Remus Rusanu    14 年前

    这只是RPC调用如何在profiler中显示的工件。客户机请求有两种主要类型:语言(类型0x01)和RPC(类型0x03),如 Free TDS protocol documentation sp_executesql .

    任何客户 sp\u执行SQL 正在呼叫。对于ODBC,对于OleDB,SqlClient,Sql Native Client,我说过, 任何 客户。因此,实体框架和ADO.Net都不是真正调用sp\u executesql的(事实上,过程甚至没有真正被调用,尽管请求的执行就像它被调用一样)。很复杂。它是协议的产物,在您添加 @parameter

        4
  •  2
  •   Adam Robinson    14 年前

    sp_executesql